Java内存模型

什么是Java内存模型(JMM)?

在这里插入图片描述

  • 如图,在不同的CPU架构中,为了避免指令重排序、或者缓存一致性问题,都提供了不同的内存屏障指令
  • 不同的操作系统中,封装的内存屏障的实现也不相同
  • Java线程,如何能够在不同的硬件、不同操作系统下,仍然能够保证线程安全性呢?这就要靠JMM(Java 内存模型)

Java内存模型(Java Memory Model ,JMM)就是一种屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范

如何屏蔽各种硬件和操作系统的差异的呢?

其实还是靠JVM,从JVM的Hotspot源码就可以看出,它是一个“翻译家,精通各种语言”,而各种硬件和操作系统就是“各国人民
在这里插入图片描述
可以看到这一个access就有很多不同种类的代码中间名字就是操作系统,最后的名字就是CPU的类型

具体来看里面实现了四种类型的内存屏障指令

inline void OrderAccess::loadload() { acquire(); } 
inline void OrderAccess::storestore() { release(); } 
inline void OrderAccess::loadstore() { acquire(); } 
inline void OrderAccess::storeload() { fence(); }

对比来看fence方法的实现
orderAccess_linux_x86.inline中

inline void OrderAccess::fence() { 
if (os::is_MP()) { 
// always use locked addl since mfence is sometimes expensive 
#ifdef AMD64 
__asm__ volatile ("lock; addl $0,0(%%rsp)" : : : "cc", "memory"); 
#else
__asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); 
#endif 
} 
}

orderAccess_linux_sparc.inline中

inline void OrderAccess::fence() { 
__asm__ volatile ("membar #StoreLoad" : : :); 
}

总结

前面博客写的原子性,可见性,有序性还有Volatile,HappensBefore规则等等之类保证线程安全的都是JMM内存模型。但是之前忘了先介绍JMM,这里补起。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值