下面是一个解释线程安全性的示例方法:
class Counter {
private int counter = 0;
public void increment() {
counter++;
}
public int getValue() {
return counter;
}
}
为了提供线程安全,有几种方法,我更喜欢使用AtomicInteger
方法。然而
1.我还想知道是否可以通过对必要的变量使用final
来提供线程安全。如果是,我如何执行此操作?
2.Java中经常使用final
作为变量和方法参数来提供线程安全性,这是原因之一吗?
我要把这个和Erwan Daniel的答案加在一起
如果您希望在所有线程之间共享计数器,这里是代码的另一个版本。
class SharedCounter {
private AtomicInteger sharedCounter ;
public Counter(){
this.sharedCounter = new AtomicInteger(0);
}
public void increment() {
sharedCounter.getAndIncrement();
}
public int value() {
return sharedCounter.get();
}
最后一个将阻止你的原子弹12
改变它正在使用的对象,你可以自由设置它的值。
final SharedCounter atomicInteger12 = new Counter() ;
否,final
关键字与线程安全没有任何共同之处。
变量上的final
关键字使它们不可变,您不能再更改它们的值。但是,它不像c中的const
关键字那样,整个变量内容都不能更改。在Java中,只有引用是不可变的。
final AtomicReference<String> toto = new AtomicReference<>("text");
toto.set("new text"); // totally fine
toto = new AtomicReference<>("text"); // does not compile, as toto is immutable reference.
但是,还有另一个关键字可以满足您的需求。它是易变的。https://www.baeldung.com/java-volatile
简而言之,所有线程上的值都会同时更改,并且立即可用。这就是所有Atomic*
Java类中使用的内容。
前任。https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/master/src/java.base/share/classes/java/util/concurrent/atomic/AtomicInteger.java
我有许多线程处理对象,其中我使用将数据库列映射到对象。 我知道在任何Java中都不是线程安全的。因此,我在中得到了一些不可预测的结果。例如,我在中也看到了。 下面是我的代码: 我的核心池大小约为20这个应用程序的最大约50。这些线程在某个时候可以处理数据库中大约100个交易记录。 使此日期格式化线程安全的最佳方法是什么?我应该使用FastDateFormat直接替换吗? 有没有更好的替代方法来确保
1.1 定义 线程安全:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协调,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 线程不安全:如果一个类对象同时可以被多个线程访问,如果不做同步处理,可能表现出线程不安全现象(抛出异常、逻辑错误)。 1.2 原子性 1.2.1 定义提供了互斥访问,同一时刻(时间段)只能有一
问题内容: HttpUrlConnection线程安全吗?即,如果我有一个连接到服务器的HttpConnection实例,并且该实例被不同的线程使用(例如,尝试同时发送POST),HttpUrlConnection将如何处理这种情况?a)他们将串行发送POST,还是b)第一个线程发送POST,获取响应,然后第二个线程发送POST?如果它们以串行方式发送POST,则意味着到同一tcp连接的多个活动P
假设我有一个Executors静态工厂方法的ExecutorService实例。 如果我从某个线程提交了一个调用,其中RetVal不是线程安全的本地实例化对象,那么当我从同一个线程获得()它时,我需要担心retvals的完整性吗?人们说局部变量是线程安全的,但我不确定当您返回一个本地实例化的对象并从其他线程接收它时,它是否适用。 下面是我的定制实现,我只是为了测试。您可以忽略EType枚举。
在PHP初期,是作为单进程的CGI来运行的,所以并没有考虑线程安全问题。 我们可以随意的在全局作用域中设置变量并在程序中对他进行修改、访问,内核申请的资源如果没有正确的释放, 也会在CGI进程结束后自动地被清理干净。 后来,php被作为apache多进程模式下的一个模块运行,但是这仍然把php局限在一个进程里, 我们设置的全局变量,只要在每个请求之前将其正确的初始化,并在每个请求之后正确的清理干净
我找到了关于线程安全的代码,但它没有来自给出示例的人的任何解释。我想知道为什么如果我不在“count”之前设置“synchronized”变量,那么count值将是非原子的(总是=200是期望的结果)。谢谢