多线程下,volatile不能保证原子性,AtomicInteger可以保证原子性。
public class AppTest implements Runnable
{
static AtomicInteger atomicInteger = new AtomicInteger();
static volatile int volatileInt;
public void increase() {
atomicInteger.incrementAndGet();
volatileInt++;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
increase();
}
}
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
new Thread(new AppTest()).start();
}
/**
* 保证上面开启的线程执行完毕,再打印出结果。 如果没有while语句,输出的值可能是线程执行中的值,从而比实际偏小。
*/
while (Thread.activeCount() > 1) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("atomicInteger:" + atomicInteger + "\tvolatileInt:" + volatileInt);
}
}
运行3次,分别得到的结果:
第一次:atomicInteger:100000 volatileInt:99819
第二次:atomicInteger:100000 volatileInt:99782
第三次:atomicInteger:100000 volatileInt:99992