一 volatile关键字的作用
1 保证任意单个变量读/写的原子性,即使是64位的long/double变量,也能保证其读/写具备原子性,但是在类似vlolatile变量的复合操作上,volatile关键字将不具备原子性
2 保证变量的可见性,即对一个变量的读,总能看到其他任意线程对该vlolatile变量的最后写入
二 volatile关键字的内存语义
1 读的内存语义
当线程读一个volatile变量的时候,首先JMM会把线程工作内存中的(也就是线程的本地内存)的变量置为无效,然后从主内存中读取共享变量,这样线程本地内存中中与主内存中的共享变量的值将一致
2 写的内存语义
当写一个共享变量的时候,线程会将对应的本地内存中的变量值刷新同步到主内存
总结:
线程A写一个共享变量,实际上是向接下来要读这个变量的某个线程发送一条(线程A对这个变量做了修改的)消息。
线程B读一个共享变量,实际上是接收到了之前其他线程发出的对这个共享做了修改的消息。
线程A对volatile变量写,线程B读共享变量读,实际上是线程A和线程B通过主内存进行通信
三 volatile关键字底层原理