Loading

volatile关键字

1. volatile

1.1 volatile的定义

定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了 volatile,在某些情况下比锁要更加方便。如果一个字段被声明成 volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

即当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果 volatile变量修饰符使用恰当的话,它比 synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度

1.2 volatile的实现原理

volatile修饰的成员变量如何保证在线程间具有可见性

通过volatile修饰,对变量进行写操作时,汇编指令中会有一个LOCK前缀指令,加了这个指令后,会引发两件事情:

  1. 将当前处理器缓存行的内容写回到系统内存
  2. 这个写回到内存的操作会使得在其他CPU里缓存了该内存地址的数据失效。其他CPU缓存数据失效,则会重新去内存中读取被修改数据的值。

注:在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存致性协议,每个处理器通过嗅探总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的內存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里。

posted @ 2020-10-09 11:31  codeduck  阅读(140)  评论(0编辑  收藏  举报