volatile是线程不安全的
首先通过一个代码来验证一下:
public class TestVolatile {
public static volatile int numb = 0;
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i <100 ; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j <1000 ; j++) {
//++不是原子性的
numb++;
}
}
}).start();
}
Thread.sleep(1000);
System.out.println(numb);
}
}
多次运行这段代码的输出结果都是小于100000,说明在循环的过程中有线程同时获取到相同的值导致,最后累加的值小于100000.
主要原因是因为numb++的执行过程不是一个原子性。numb++的操作过程可以参考: