volatile的实现原理

    Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。

    那volatile是如何实现可见性的呢,如果我们对volatile修饰的字段进行写操作时,CPU会做些什么事情呢。

    volatile的实现原理_第1张图片

    如果将上述代码转变成汇编代码,如下:


    被volatile变量修饰的共享变量进行写操作的时候会多出第二行汇编代码,也就是lock前缀的那行汇编代码

Lock前缀的指令在多核处理器下会引发两件事情:

    1、将当前处理器缓存行的数据写回系统内存

    2、这个写回内存的操作会使其他CPU里缓存了该地址的数据无效化

这是为什么呢,因为在Java内存模型中规定,所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被线程使用到的变量的主内存副本拷贝,线程对变量的操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。线程与内存交互如下图所示

volatile的实现原理_第2张图片

但是如果你对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个缓存行的数据写回内存。而在读取一个volatile类型的变量时,不会从线程私有数据栈中取得变量的值,而是强制从公共堆栈中取得变量的值。

    操作volatile变量如下图所示

volatile的实现原理_第3张图片

你可能感兴趣的:(线程与并发)