volatile关键字是JVM提供的最轻量级的同步机制,一方面它提供了变量对所有线程的可见性,另一方面它禁止了指令重排序
1)将当前工作内存里面的新值写回主内存去
2)这个写回内存的操作会使在其他工作内存里的旧值失效
变量的可见性:就是当一个线程改变了变量的值,新值对于其他线程来说可以立即得到。而对于普通变量来说是不可以的,普通变量的值在线程间传递均需要通过主内存来完成。
volatile修饰的变量之所以可以被立即得到,在于当一个线程对一个volatile变量进行写操作后,会有一个lock前缀的指令,该指令会引发下面两件事情:
1)将当前工作内存里面的新值写回主内存去
2)这个写回内存的操作会使在其他工作内存里的旧值失效
为了保证各个工作线程里缓存的数据一致,就会实现一致性协议,每个线程通过嗅探在总线上传播到数据来检查自己的缓存的值是不是过期了,当发现该值发生了变化,就会将该值为无效,当需要该值时,再从工作内存中读取新值。
禁止指令重排:普通的变量只会保证在该方法的执行过程中所有依赖赋值结果的地方都能获得正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序是否一致,经volatile修饰后,同样是由于lock指令,这个指令相当于一个内存屏障,指令重排时不能把内存屏障后的指令重排到内存屏障之前
若volatile修饰符使用恰当的话会比synchronized的使用和执行成本更低,它不会引起线程上下文的切换和调度。
同时volatile变量的读操作的性能消耗与普通变量几乎没有什么差别,但是写操作则可能会慢一些,它需要在本地代码中插入许多内存屏障指令来保证禁止了指令重排序。
volatile关键字确保了变量对所有线程的可见性,并禁止了指令重排序。通过lock指令保证了写入主内存的同时使其他线程的工作内存中的旧值失效。
24万+

被折叠的 条评论
为什么被折叠?



