volatile关键字
书本知识
在《深入理解Java7》这本书中讲到volatile关键字的时候说,该关键字用来对共享变量的访问进行同步,对一个volatile变量的上一次写入操作和下一次读取操作之间存在“在之前发生“的顺序。所以下一次读取的值一定是上一次写入的值。
网络知识
在看书以前曾看过无数他人博客对这个关键字的解析,我梳理一下对这个关键字的理解。
这个关键字可以保证上一次对该关键字的写入操作可以被下一次对该关键字的读取操作看见,它的实现依赖于硬件,并且在单核CPU的机器上是不存在脏读问题的。
这个关键字的底层实现原理可以这样理解:
- 在对有volatile修饰的变量进行写入的操作的时候,编译器会多出几行代码来,这多出的几行代码的作用是
- 将当前处理器的缓存行的数据写回到内存中
- 在总线上传递一个信号,告知其他CPU该内存地址的数据过期
- 其他CPU嗅探到总线上的这个信息后,将自己缓存中相应的缓存数据置为无效状态
- 当其他CPU上执行相关的运算时,它会发现这个这个缓存数据被置为了无效,于是就会去内存中加载 这样一来,就保证了对变量的写入操作可以被之后的读取操作看见。
volatile关键字比synchronized性能更好,因为它不涉及加锁。