Java内存模式

以前我在看一些并行编程的书时候,老是有些模糊,后来看到《深入理解Java虚拟机 第二版》这边书在并行哪章时候,才逐渐清晰,现在就来讲讲Java内存模式。
- 主存和工作内存
1. 主存 保存了有关对象class属性字段,全局变量等信息
2. 工作内存指线程相关存储信息。
一般来说,工作内存会得到主存中的一部分内存信息拷贝,当工作内存更新了某些变量值得时候必须要回写到主存中。

java软件 模拟内存占用程序 java内存模式_并发编程

  • 主存和工作内存交互操作
  1. lock 作用于主存内存变量,它把一个变量标识为一条线程独占的状态
  2. unlock 作用于主存内存变量,他把处于锁定的变量释放出来,释放后的变量可以被其他线程锁定
  3. read 作用于主存内存变量,把变量读到工作内存中,一般load使用
  4. load 作用于工作内存变量,把read的操作的变量放入工作内存变量副本中
  5. use 作用于工作内存存变量,把变量传给执行引擎,每当虚拟机遇到一个需要使用到变量的值得字节码指令时候就好执行这个操作
  6. assign赋值,作用于工作内存。它把一个从执行引擎接收的赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作
  7. store 作用于工作内存,它把一个变量从工作内存中传送到主内存中,以便随后write操作
  8. write 作用于主内存变量,把store的从工作内存中得到变量的值放到主内存的变量中去

需要注意的将一个变量从主存到工作内存,需要顺序执行read->load stroe->write操作。也就是说,read与Load,store与write之间可以插入其他指令,如果需要访问变量a,b,一种可能是顺序read a,read b,load b,load a 。

八个操作的规则有一下八种规则:
1. 不允许 read 和 load、 store 和write操作单独出现
2. 不允许一个线程丢弃它的最近assign操作即变量在工作内存中改变了之后必须把该变化同步回主内存
3. 不允许线程无原因(没有发生过如何assign操作)地把数据从线程的工作内存同步主内存中
4. 一个新的变量只能在主内存”诞生”.不允许在工作内存中直接使用一个未被初始化(load或assign)的变量,换句话说,就是一个变量实施use、store操作之前,必须先执行过了assign和load操作
5. 一个变量同一时刻只能被一条线程lock,并且可以同时多次lock,进行多少次lock必须unlock多少次,变量才会被解锁
6. 如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值
7. 如果一个变量先没有被Lock操作锁定,那就不允许对它unlock操作,也不允许去unlock一个被其它线程锁定的变量
8. 对一个变量执行unlock操作之前,必须先把此变量同步回主存中(执行store、write操作)
摘自《深入理解Java虚拟机 第二版》
下一篇,判断代码是否并发的先行发生原则。