我知道从不同的线程并发访问同一个对象,没有同步,通常是一件坏事。但是这个案例呢:
我有多个线程正在运行(考虑两个,ThreadA 和 ThreadB)。我也有这个静态类来计算线程做某事的次数。
public class Counter {
static private int counter=0;
static public void incCounter() {
counter++;
}
}
如果 ThreadA 和 ThreadB 都调用 Counter.incCounter() 会发生什么?
最佳答案
这不安全。
每个线程将尝试读取 counter
,加一,写回结果。您不能保证这些读取和写入发生的顺序,或者即使结果对每个线程都是可见的。
特别是,一种失败情况是每个线程读取值 0,将它增加到 1,然后写回值 1。即使在两个线程尝试增加它之后,这也会给计数器的值 1。
考虑使用 AtomicInteger .incrementAndGet() 代替。
关于java多线程访问原始变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311912/