理解JMM
2020-03-01 16:02:08来源:博客园 阅读 ()
理解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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:多线程笔记 - AIO
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 通俗理解spring源码(六)—— 默认标签(import、alias、be 2020-06-07
- 一文带你深入理解JVM,看完之后你还敢说你懂JVM吗?颠覆you 2020-06-02
- 深入理解Mybatis(第一讲)——手写ORM框架(简易版Mybatis 2020-06-01
- 无责任书评:每个Java程序员都应该深入理解Java虚拟机 2020-05-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash