JVM内存模型专门对volatile定义了一些特殊的访问规则。
volatile修饰的变量有两种特性
保证此变量对所有线程的可见性
这里的可见性,是指当一个线程对此变量进行修改,新值对于其他线程是可以立即得知的,而普通变量做不到这一点,普通变量的值在线程间的传递均需要通过主内存来完成。例如:线程A在修改了变量的值之后,要回写到主内存,而线程B在线程A回写完成之后再从主内存中进行读取,才对线程B是可见的。
volatile虽然可以保证对所有线程的可见性,但是在高并发下依然是不安全的,原因在于Java里的操作并非原子操作。
举个例子,看一段代码:
public class TestVolatile {
public static volatile int num=0;
public static void increase(){
num++;
}
public static void main(String[] args) {
Thread[] thread