在功能上锁更强大,在性能上volatile更好!
volatile 的单个读写(注意仅仅是对单个变量的赋值和取值而不是其他的复杂操作,例如运算等)能够实现与锁相同的运行效果,也就是能实现一种运行的先后顺序。这个类似锁的实现是通过线程间的通信来做到的
线程A写入变量之前通知线程B我正在写数据先别读取,A写入后再通知B我已经写完了,你不要用你之前的东西来,我把这个东西更新了快来拿!
hahahahah!
如下的东西需要知道"重排序"这个概念,重排序会重排序没有数据以来的指令。有3种级别的重排序:
(1)编译器级别的重排序优化
(2)指令级别的重排序
(3)内存系统的重排序
重排序简单来形容现象就是硬件处理器为了提高利用率(很类似物理化学中的自由度哈!),就会提高运行额并行度,
同一段时间内多做点事情,因此导致在同一时间把代码里顺序执行的东西变得并没有没有我们代码上写的按照一种单线程的时间顺序来执行,
从而可能会导致脏读或者错读的问题。
1. volatile能够在对单独变量的写时将值刷新到主内存(该步骤是一个原子性的),在其他线程读取该volatile变量时能够屏蔽本地内存的同一变量,而使用主内存中的变量,这样就保证了读取的是最新的volatile变量值。
2. volatile变量能够通过编译后生成的指令序列中加入内存屏障(StoreLoad,LoadStore,StoreStore,LoadLoad)来避免处理器重排序从而避免处理器执行未按照代码逻辑顺序导致的非预期结果问题。并且这个处理是兼容不同处理器架构和平台的。
3. 屏障省略:
如果对volatile变量的操作顺序是写-读那么能够避免很多不必要的屏障插入