java多线程访问原始变量

Kev*_*vin 2 java multithreading primitive-types

我知道同时从不同的线程访问同一个对象,没有同步,通常是一件坏事.但是这个案子呢:

我有多个线程在运行(考虑两个,ThreadA和ThreadB).我也有这个静态类来保持Thread执行某些操作的次数.

public class Counter {
  static private int counter=0;
  static public void incCounter() {
    counter++;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果ThreadA和ThreadB都调用Counter.incCounter()会发生什么?

Dav*_* L. 11

这不安全.

每个线程都会尝试读取counter,添加一个并回写结果.您无法保证这些读写操作的顺序,或者即使结果对每个线程都可见.

特别是,一个失败的情况是每个线程读取值0,将其递增为1,并回写值1.即使在两个线程尝试递增它之后,这也会使计数器的值为1.

请考虑使用AtomicInteger .incrementAndGet().