java并发编程实战对volatile的解释就是:当一个域声明为valatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。
表示呵呵哒。
官方解释:如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。
1.jvm对volatile变量做了什么事情?
在volatile声明的变量进行写操作的时候,JVM干了一件事,在前面加上了Lock为前缀的汇编代码。
我们先看下多处理器的高速缓存,再说加Lock会发生什么。
每个CPU会缓存主存的共享变量,从而提高处理效率。所以共享变量在每个CPU上都会有一份缓存。
2.Lock为前缀的汇编代码会发生什么?
多处理器下,Lock为前缀的汇编代码发生下面两件事情。
1.让当前缓存行写回到主存中。
2.为当前缓存行加入缓存一致性协议。(效果就是:其他处理器会将该缓存行置为失效)
3.什么是缓存一致性协议
MESI协议。确保多处理器下缓存是一致的。具体的协议内容可以自行百度,监听+广播+状态的控制去实现的。
4.针对volatile的内存语义、内存屏障这篇说的很好,直接上连接了
http://www.importnew.com/2786...
写的时候加了StroeLoad内存屏障,StroeLoad基于Lock指令实现的,所以编译后会有Lock为前缀的指令
5.总结
以上说明了volatile的可见性。任何修改,其他线程是可见的。同时也说明的java并发编程实战的解释不准确,甚至是错误的。volatile修饰的变量还是会缓存的,只是通过一系列处理保证了所有线程看到这个变量的值是一致的