-
JMM和物理机内存模型不是一个范畴。
-
JMM和Java运行时数据区没有直接对应关系。
03以史为鉴-回看计算机内存模型
========================
**1、**现代计算机内存模型
物理机遇到的并发问题与Java虚拟机中的情况有不少相似之处,物理机对并发问题的处理方案对虚拟机的实现也有相当大的参考价值。现代计算机中,CPU的指令速度远远超过内存的存取速度,由于计算机的存储设备与CPU的运算速度有几个数量级的差距,所以现在计算机中都不得不加入一层读写速度尽可能接近CPU运算速度的高速缓存(cache)来作为内存和CPU之间的缓冲。
基于高速缓存的存储交互很好的解决了CPU和内存的速度的矛盾,但也引入了一个新的问题,缓存一致性,在多处理器系统中,每个CPU都有自己的高速缓存,而他们又共享同一主内存,当多个处理器运算任务都涉及到同一块主内存区域时,将可能导致各自的缓存数据不一致。为了解决这个问题,需要各个处理器在访问内存时,需要遵循一些协议,例如MSI、EMSI、MOSI等。
图1 计算机内存模型
2、缓存一致性
为了解决这个问题,先后有过两种办法:
- 总线锁机制
总线锁就是使用CPU提供的一个LOCK#信号,当一个处理器在总线上输出此信号,其他处理器的请求将被阻塞,那么该处理器就可以独占共享锁。这样就保证了数据一致性。
- 缓存锁机制
但是总线锁定开销太大,我们需要控制锁的力度,所以又有了缓存锁,核心就是缓存一致性协议,不同的CPU硬件厂商实现方式稍有不同,有MSI、MESI、MOSI等。
3、多线程编程面临的问题
多线程编程面临的两个重要的问题是:
-
线程之间的通信
-
线程之间的同步
线程之间的通信是指线程之间通过什么方式来交换信息。
同步是指程序用于控制不同线程之间操作发生相对顺序的机制。
线程的通信方式:
-
共享内存
-
消息传递
在共享内存的并发模式里,线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来实现隐式通信。
在消息传递的并发模式里,同步是显式进行的,程序员必须显式指定某个方法或某段代码需要在线程之间互斥进行。
图2 共享内存并发模型
在消息传递的并发模式里,线程之间没有公共状态,线程之间必须明确发送消息来显式进行通信。
在消息传递的并发模型里,同步是隐式进行的,由于消息发送必然在消息接收之前,因此同步是隐式进行的。
图3 消息传递并发模型
04师夷长技-直面JSR133
=======================
1、JSR133是什么
JSR-133规范,即Java内存模型与线程规范,由JSR-133专家组开发。JSR-133规范是JSR-176(定义Java平台Tiger(5.0)发布版的重要特性)的一部分。本规范的标准内容将合并到Java语言规范、Java虚拟机规范以及java.lang包的类说明中。
2、 JSR133倾诉的对象是谁
身边好多同事反馈看不懂JSR133的内容,一方面是因为文档全部为英文,并且包含大量的专业英语。另外一方面是没有弄明白JSR133倾诉的对象到底是谁。如果弄明白的倾诉的对象,然后对号入座就能理解JSR133在说什么。JSR133倾诉的对象有两个,一个是使用者(程序员)ÿ