在这之前需要先了解java内存模型
volatile特性
- 可见性。对一个volatile变量的读,总能看到(任意线程)对这个volatile变量最后的写入。
原子性。对任意一个volatile单个变量的读/写具有原子性。
但是类似于volatile++这种不具有原子性。因为volatile只保单个证读写具有原子性,这里的volatile++相当于1)读volatile的值,2)volatile + 1, 3)将更新的值赋值给volatile变量。其中包含了多个的操作,所以不具备原子性。
通俗的讲,单个的volatile变量的读/写可以理解为加了一个锁
例如:
public volatile int a = 0;
public void set(){
a = 1;
}
这里可以理解为:
public int a = 0;
public synchronized void set(){
a = 1;
}
volatile的happens-before关系
首先需要理解重排序的概念,简单介绍重排序:
例:
private int a = 0;
private boolean isSet = false;
public void set(){