一、问题起源
这篇文章的起源其实是博主想要学习Java并发,计算机并发的痛点在于一方面cpu越来越多核化,另外
一个方面就是cpu和存储以及通信子系统的速度差距太大,大概来说,cpu速度是ns级,内存100ns,硬盘ms,内存比cpu慢100倍,
硬盘比cpu慢100万倍,cpu如果-等这些速度慢的多的小伙伴,势必造成计算资源的浪费。物理机为了解决cpu与内存的速度差,
在两者之间加入了缓存,有缓存就会引入新问题,即缓存一致性问题。
图1(图片来自参考文献【1】)
为了解决缓存一致性问题,各个cpu在访问缓存和主内存时需要遵守一定的缓存一致性协议,
把对特定的内存和缓存的访问过程抽象出来,就称之为“内存模型”。
二、JVM的内存模型
如下图所示,与物理机中cpu访问内存的结构类似,JVM内存模型中,所有变量都存储在主内存(Main Memory)
每条线程有自己的工作内存(Working Memory),变量在不同线程间的传递需要通过主内存。
图2(图片来自参考文献【1】)
如上所述,变量在线程间的传递需要工作内存和主内存间的交互。这种交互要遵循一定的一致性协议。
这里简单称为“交互协议”,交互协议具体体现为8中原子操作和一些操作规则,如下:
>8中原子操作
- lock:作用于主内存的变量,把一个变量标识为一条线程独占的状态;
- unlock:作用于主内存的变量,把一个变量从一条线程独占的状态释放出来,释放后的变量才可以被其他线程上锁;
- read:作用于主内存的变量,把一个变量从主内存传输到线程的工作内存,这一步仅仅是传输动作;
- load:作用于工作内存的变量,把read中传输过来的变量放入工作内存的副本中;
- use:作用于工作内存的变量,把工作内存中的一个变量传递给执行引擎,即线程在读取变量的值;
- assign:作用于工作内存的变量,把一个从执行引擎接收到的值赋给工作内存的变量,即线程在写变量的值;
- store:作用于工作内存的变量,把一个变量的值传输到主内存,这一步仅仅是传输动作;
- write:作用于主内存的变量,把store过来的变量值放入主内存的变量中。
>操作规则
未完待续。。。
参考文献:
【1】深入理解Java虚拟机 by 周志明
【2】Java并发编程实战 机械工业出版社2012
时间: 2024-10-13 12:36:54