人生需要总结

理解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分配执行时间

 

posted @ 2020-03-01 11:40  水木桶  阅读(420)  评论(0编辑  收藏  举报