volatile主要保证内存可见
例子:
定义变量底层实现原理:
Java内存模型(JMM)规定了所有的变量都存储在主内存中,主内存中的变量为共享变量,而每条线程都有自己的工作内存,线程的工作内存保存了从主内存拷贝的变量,所有对变量的操作都在自己的工作内存中进行,完成后再刷新到主内存中。
区别在于:
非volatile:读取自己的工作内存(不刷新)
volatile:读取自己的工作内存(是将主内存同步到自己的内存中【也叫所谓的刷新】)
原子性:
其实volatile不能实现原子性:
所有操作都是由(读、写、修改)实现的,想象一下 所谓的原子性 是局部的 ,如果把 读、写、修改 正和成一个事物去处理 就要加锁去处理。
重排序:
所谓重排序只存在于多线程中 举例如下:
public class RecordExample2 {
int a = 0;
boolean flag = false;
/**
* A线程执行
*/
public void writer(){
a = 1; // 1
flag = true; // 2
}
/**
* B线程执行
*/
public void read(){
if(flag){ // 3
int i = a + a; // 4
}
}
}
也就是说 i 有可能等于1 或者等于0
这也是volatile的充分体现,也就是上面说的可见性。
别人家的详解:https://www.ibm.com/developerworks/cn/java/j-jtp06197.html