/**
* 每天一个知识点day86 TODO java内存模型
*
* Java内存模型的主要目的是定义程序中各种变量的访问规则,
* 即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。
* 此处的变量与java编程中所说的变量有所区别,它包括了实例字段,静态字段
* 和构成数组对象的元素,但是不包括局部变量与方法参数,
* java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,
* 线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有
* 操作都必须在工作内存中进行,而不能直接读写主内存中的数据,
* 不同的线程之间也无法访问到对方工作内存中的变量,线程间变量值的传递需要
* 通过主内存来完成。
*
* 这里所讲的工作内存和主内存与java中的堆 栈 方法区并不是同一个层次的对内存
* 的划分,这两者基本上是没有任何关系的,如果两者一定要勉强对应起来,那么从
* 变量 工作内存 主内存的定义来看,主内存主要对应于java堆中的对象实例数据部分
* 而工作内存则对应虚拟机栈中的部分区域,从更基础的层次上说,主内存直接对应于
* 物理硬件的内存,而为了获取更好的运行速度,虚拟机可能会让工作内存优先存储于
* 寄存器和高速缓存中,因为程序运行时主要访问的是工作内存。
*
* 关于主内存和工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作
* 内存、如何从工作内存同步回主内存这一类的实现细节,java内存模型中定义了
* 以下8种操作来完成。
* lock 锁定 作用于主内存的变量,它把一个变量标识为一条线程独占的状态
* unlock 解锁 作用于主内存的变量
* read 读取 作用于主内存的变量
* load 载入 作用于工作内存的变量
* use 使用 作用于工作内存的变量
* assign 赋值 作用于工作内存的变量
* store 存储 作用于工作内存的变量
* write 写入 作用于主内存的变量
*
* 如果要把一个变量从主内存拷贝到工作内存,那就要按顺序执行read和load操作,
* 如果要把变量从工作内存同步回主内存,就要按顺序执行store和write操作,
* java内存模型只要求以上两个操作必须是按顺序执行,但不要求是连续执行。
*
*
*
*/
网友评论