理解JMM

2020-03-01 16:02:08来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

理解JMM

理解JMM,java线程状态转换

背景

之前以为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分配执行时间

 


原文链接:https://www.cnblogs.com/shuimutong/p/12388849.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:(一)Spring源码——IoC骗

下一篇:多线程笔记 - AIO