理解JMM
背景
之前以为JMM就是JVM,后来才了解到JMM特指内存模型,和GC关联比较弱。
书反复看了很多遍,看的时候觉得看懂了,但是放下书口述,总感觉说不明白。所以还是直接自己总结得了!
一、JMM
1、为什么需要JMM?
JVM为了屏蔽硬件和操作系统对内存访问的差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。
2、JMM的背景
CPU的运算很快,内存的运算速度很慢,但是大多数计算任务都不能只靠处理器“计算”就能完成,处理器至少要与内存交互。为了缓解速度不匹配的问题,人们在CPU和内存之间加入了高速缓存,让运算尽可能的快。但是这也带来了新的问题:缓存一致性。为了解决缓存一致性问题,所以对各个处理器访问缓存制定了协议,CPU在读写缓存数据时需要遵循协议。
3、JMM的主要目标
定义程序中各个变量的访问规则,即将变量存储到内存和从内存中取出变量这样的底层细节。
4、线程、主内存、工作内存的关系
1)每条线程有自己的工作内存,线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝
2)线程对变量的所有操作都必须在工作内存中进行
3)不同的线程之间无法直接访问对方工作内存中的变量
4)线程间变量值的传递都需要通过主内存来完成
5、volatile特性
1)保证此变量对所有线程的“可见性”
当一条线程修改了一个变量的值,新值对于其他线程来说是可以立即得知的。
2)禁止指令重排序优化
6、原子性、可见性与有序性
JMM是围绕在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的。
1)可见性
JMM是通过在变量修改后将新值同步回主内存中,在变量读取前从主内存刷新变量值的操作来实现可见性。
普通变量与volatile变量的区别是,volatile的变量新值能够被立即同步到主内存,以及每次使用前立即从主内存刷新。
2)有序性
synchronized是基于“一个变量在同一个时刻只允许一条线程对其进行lock操作”。
二、线程
Java线程模型是基于操作系统原生线程模型实现的。
1、线程的状态转换
新建:创建后尚未启动的线程
运行:可能在运行,也有可能在等待CPU分配执行时间