【java】知识系谱-基础篇-线程-volatile

本文深入解析了Java中Volatile变量的工作原理,包括JVM对其的操作、缓存一致性协议(MESI)以及内存屏障等概念。文章揭示了Volatile如何确保多线程环境下变量的可见性和一致性。
java并发编程实战对volatile的解释就是:当一个域声明为valatile类型后,编译器与运行时会监视这个变量:它是共享的,而且对它的操作不会与其他的内存操作一起被重排序。volatile变量不会缓存在寄存器或者缓存在对其他处理器隐藏的地方。

表示呵呵哒。

官方解释:如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。

1.jvm对volatile变量做了什么事情?

在volatile声明的变量进行写操作的时候,JVM干了一件事,在前面加上了Lock为前缀的汇编代码。
我们先看下多处理器的高速缓存,再说加Lock会发生什么。
每个CPU会缓存主存的共享变量,从而提高处理效率。所以共享变量在每个CPU上都会有一份缓存。

clipboard.png

2.Lock为前缀的汇编代码会发生什么?

多处理器下,Lock为前缀的汇编代码发生下面两件事情。
1.让当前缓存行写回到主存中。
2.为当前缓存行加入缓存一致性协议。(效果就是:其他处理器会将该缓存行置为失效)

3.什么是缓存一致性协议

MESI协议。确保多处理器下缓存是一致的。具体的协议内容可以自行百度,监听+广播+状态的控制去实现的。

4.针对volatile的内存语义、内存屏障这篇说的很好,直接上连接了

http://www.importnew.com/2786...
写的时候加了StroeLoad内存屏障,StroeLoad基于Lock指令实现的,所以编译后会有Lock为前缀的指令

5.总结

以上说明了volatile的可见性。任何修改,其他线程是可见的。同时也说明的java并发编程实战的解释不准确,甚至是错误的。volatile修饰的变量还是会缓存的,只是通过一系列处理保证了所有线程看到这个变量的值是一致的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值