介绍
JMM(Java Memory Model),Java内存模型
线程之间的通信
线程之间的通信机制有两种,共享内存和消息传递
在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信
在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,在Java中典型的消息传递方式就是wait()和notify()
Java内存模型中的重排序
源代码->编译器优化重排序->指令级并行重排序->内存系统重排序->最终执行指令序列
重排序和依赖性
数据依赖性
控制依赖性
保证单线程下正确执行
as-if-serial
解决在并发下的问题
内存屏障(Memory Barrier)
- 禁止重排序
- 强制刷出缓存
| 屏障类型 | 指令示例 | 说明 |
|---|---|---|
| LoadLoad Barriers | Load1;LoadLoad;Load2 | 确保Load1数据的装载,之前于Load2及所有后续装载指令的装载 |
| StoreStore Barries | Store1;StoreStore;Store2 | 确保Store1数据对其他处理器可见(刷新到内存),之前于Store2及所有后续存储指令的存储 |
| LoadStore Barries | Load1;LoadStore;Store2 | 确保Load1数据装载,之前于Store2及所有后续的存储指令刷新到内存 |
| StoreLoad Barries | Store1;StoreLoad;Load2 | 确保Store1数据对其他处理器变得可见(指刷新到内存),之前于Load2及所有后续装载指令的装载。StoreLoad Barries会使该屏障之前的所有内存访问指令(存储和装载指令)完成之后,才执行该屏障之后的内存访问指令 |
参考博客
本文标题:JMM和底层实现原理
本文链接:https://blog.quwenai.cn/post/8613.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。






还没有评论,来说两句吧...