volatile关键字用来保证有序性和可见性。
有序性:
这跟Java的内存模型有关系。我们写的代码不一定是按照我们的书写的顺序来执行,编译器会做重排序,这样做的好处是减少了流水线的阻塞。
volatile变量规则是:对一个变量的写操作先行发生于后面的读操作;有序性是通过插入内存屏障来保证。
可见性:
首先Java的内存模型分为主内存和工作内存,线程A将变量i从主内存读取到工作内存中,并做+1操作,此时并没有将i刷新到主内存中。线程B读取到的i还是旧值。加了volatile关键字后汇编指令会多Lock前缀,保证了内存可见性。