05 java中volatile关键字
1 并发编程的三个重要特性
并发编程有三个至关重要的特性,分别是原子性、有序性、可见性。
原子性:所谓原子性是指在一次的操作或者多次的操作中,要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断,要么所有的操作都不执行。
可见性:可见性是指当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值
有序性:有序性是指程序代码在执行过程中的先后顺序,由于Java在编译器以及运行期的优化,导致了代码的执行顺序未必就是开发者编写代码时的顺序
2 volatile
JMM决定一个线程对共享变量的写入何时对另一个线程可见,JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。这三者之间的交互关系如下
volatile具备两种特性,第一就是保证共享变量对所有线程的可见性。将一个共享变量声明为volatile后,会有以下效应:
(1)当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去;
(2)这个写会操作会导致其他线程中的缓存无效。
写入过程如下: