摘要:内存模型定义是一种规范,它规范了虚拟机与计算机内存之间是如何协同工作的,它规定了一个线程是如何和何时可以看到其它线程修改过的共享变量的值,以及如何同步共享变量的值。假设主内存中变量的值为,线程和同时执行。
Java内存模型(JMM)
定义:JMM是一种规范,它规范了Java虚拟机与计算机内存之间是如何协同工作的,它规定了一个线程是如何和何时可以看到其它线程修改过的共享变量的值,以及如何同步共享变量的值。
当一个线程可以访问这个对象的时候,他也可以访问这个对象的成员变量,如果两个线程同时调用同一个对象上的同一个方法,他们将都会访问这个对象的成员变量,但是每一个线程都拥有了这个变量的私有拷贝(变量副本)。
假设主内存中变量的值为1,线程A和B同时执行。线程A从主内存中拿到的值是1,存入自己的本地内存中,然后执行+1的操作结果为2,然后将2写回主内存中。JMM - 线程同步的八种操作
同时线程B从主内存中拿到的值也是1,存入线程B的本地内存中+1结果也是2,写入主内存,而不是读取线程A的结果之后在进行计算,这两个线程间的数据是不可见的,因此计数就出现了错误,这个时候就需要添加一些同步手段,来保证并发时程序处理的准确性。
lock(锁定)
lock:作用于主内存的变量,把一个变量标示为一条线程独占状态
unlock(解锁)
unlock:作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read(读取)
read:作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
load(载入)
load:作用于工作内存的变量,他把read操作从主内存中得到的变量值放入工作内存的变量副本中
use(使用)
use:作用于工作内存变量,把工作内存中的一个变量值传递给执行引擎
assign(赋值)
assign:作用于工作内存变量,他把一个从执行引擎接收到的值赋值给工作内存变量
store(存储)
store:作用于工作内存变量,把工作内存中的一个变量值传递到主内存中,一边随后的写操作
write(写入)
write:作用于主内存变量,他把store操作从工作内存中一个变量的值传递到主内存的变量中线程同步规则
如果要把一个变量从主内存复制到工作内存,就需要按顺序的执行read和load操作,如果把变量从工作内存同步到主内存中,就要按顺序执行store和write操作。但是Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行不允许read和load、store和write多带带出现
不允许一个线程丢弃它的最近assign的操作,即变量在工作内存中改变了之后必须同步到主内存中
不允许一个线程无原因(没有发生过任何assign操作)就把数据从工作内存同步到主内存中
一个新的变量只能在主内存中诞生,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量。也就是对一个变量实施use和store操作之前,必须先执行过assign和load操作
一个变量在同一时刻只允许一条线程对其进行lock操作,但是lock操作可以被同一条线程重复执行多次,多次执行lock后,只执行相同次数的unlock操作,变量才会被解锁。lock和unlock必须成对出现
如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值
如果一个变量事先没有被lock锁定,则不允许对他执行unlock操作,也不允许去unlock一个被其他线程锁定的变量
对一个变量执行unlock操作之前,必须事先将此变量同步到主内存中(执行store和write)
过程图解
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77566.html
摘要:编译器,和处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。正确同步的多线程程序的执行将具有顺序一致性程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。 前情提要 深入理解Java内存模型(六)——final 处理器内存模型 顺序一致性内存模型是一个理论参考模型,JMM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照。JMM和处理器内...
摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://segmentfault.com/img/remote/1460000013474312?w=1920&h=1271); 前提 《深...
摘要:前提深入理解内存模型程晓明著,该书在以前看过一遍,现在学的东西越多,感觉那块越重要,于是又再细看一遍,于是便有了下面的读书笔记总结。同步同步是指程序用于控制不同线程之间操作发生相对顺序的机制。线程之间的通信由内存模型控制。 showImg(https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6RtPu3BNx3zps1JhSmPICRw7QgeOmxOfTb...
摘要:内存模型对内存模型的介绍对内存模型的结构图的线程之间的通信是通过共享内存的方式进行隐式通信,即线程把某状态写入主内存中的共享变量,线程读取的值,这样就完成了通信。 Java内存模型(JMM) 1.对内存模型的介绍 ①对Java内存模型的结构图 java的线程之间的通信是通过共享内存的方式进行隐式通信,即线程A把某状态写入主内存中的共享变量X,线程B读取X的值,这样就完成了通信。是一种...
摘要:下面是该程序在两个内存模型中的执行时序对比图在顺序一致性模型中,所有操作完全按程序的顺序串行执行。不保证未同步程序的执行结果与该程序在顺序一致性模型中的执行结果一致。 前情提要 深入理解Java内存模型(二)——重排序 数据竞争与顺序一致性保证 当程序未正确同步时,就会存在数据竞争。java内存模型规范对数据竞争的定义如下: 在一个线程中写一个变量, 在另一个线程读同一个变量,...
阅读 2724·2021-11-17 09:33
阅读 3067·2021-10-25 09:44
阅读 1160·2021-10-11 10:59
阅读 2351·2021-09-27 13:34
阅读 2874·2021-09-07 10:19
阅读 2090·2019-08-29 18:46
阅读 1476·2019-08-29 12:55
阅读 898·2019-08-23 17:11