什么是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,这里补起。