第一课 JMM
郑重声明:以下内容为个人学习后的一个分享也是将个人理解和记录笔记放到这里,感兴趣的朋友可以看看,如果觉得有什么不对的地方,请您善意的提醒以下我会根据情况进行修改,
这里做分享其实也是做个记录。这里目前只写一部分慢慢我这边会完善。
- 什么是JMM
JMM即Java内存模型,它是一个抽象概念并不真实存在,描述的是一种规则或规范
- 同步
1、同步是指程序用于控制不同线程之间操作发生相对顺序的机制。
2、工作原理:
(1)线程解锁前
共享变量的值刷回主内存
(2)线程加锁前
将主内存的最新值刷回到自己的工作内存
(3)加锁解锁是同一把锁
3、线程在对变量的操作其实是在工作内存中进行的,步骤分为
(1)将变量从主内存中拷贝到自己的工作内存
(2)操作变量
(3)将操作后的变量刷回主内存
- JMM的特性
- 可见性
图画的有点不好看啊!大家别介意
可见性是什么意思呢?根据上图我解释一下,就是说现在机器里cpu的线程有可能不止一个,如果修改一个值的时候一个线程需要修改值那么另外一个是不清楚了,过程:cpu1修改了XXX值,这时候首先修改的是CPU1缓存中的值,然后再由缓存区刷到主存,那么这时候如果cpu2在读取主存前值还没有被刷新那就糟糕了,这里就牵扯到一个词缓存一致性,所以呢总结一句话无论变量是否修改,其他线程读取的变量均读取主内存中的值(修改后也是刷回主内存的)这就是可见性
- 原子性
一套事务中间不能被插队,做一个事情要么成功,要么失败
- 有序性
1、指令重排:
什么是指令重排:
举例:早饭排队去买饭,A1 先去要了菜包,B2要的是玉米,C3要的是菜包,为了处理方便营业员会将俩个菜包拿出来分别给了A1和C3,再去给B2拿玉米,本来顺序是A1àB2àC3,现在变成了 A1àC3àB2这就是重排序了,其实还有一个例子更好理解,高考数学题,一共10道选择题难易程度不等,大家会按照1—10题这么做么 ,大部分人应该是看了10个题后挑选简单的做吧,这做题的顺序不就变了,被你个人给重新排序了
2、解决指令重排的方式
解决指令重排也就是禁止指令重排,使用内存屏障,内存屏障:保证特定操作的执行顺序、保证某些变量的内存可见性、通过内存屏障禁止在内存屏障前后的指令执行重排序的优化。
3、重排序共有三种
编译器优化的重排序、指令级并行的重排序、内存系统的重排序
参考资料
【Java线程】Java内存模型总结
http://blog.csdn.net/vking_wang/article/details/8574376