掌握系列之并发编程--6.Java内存模型

掌握高并发、高可用架构

第二课 并发编程

从本课开始学习并发编程的内容。主要介绍并发编程的基础知识、锁、内存模型、线程池、各种并发容器的使用。

第六节 JAVA内存模型

JMM 内存模型

Java内存模型(Java Memory Model)规范了Java虚拟机与计算机内存是如何协同工作的。对于开发并发程序,理解Java内存模型是非常重要的。它规定了如何和何时可以看到由其他线程修改过的共享变量的值,以及在必要时如何同步的访问共享变量。

JMM内部原理

JMM把JVM内部划分为线程栈

Java Memory Model

每个运行在JVM中的线程都拥有自己的线程栈,这个线程栈包含了这个线程调用的方法当前执行点的相关信息。一个线程仅能访问自己的线程栈,线程创建的本地变量对其他线程不可见。

堆上包含Java程序中创建的所有对象,无论是哪个对象创建的,包括原始类型的对象版本。

enter image description here

一个原始类型的本地变量,它是在线程栈中的;

一个引用对象类型的本地变量,那么引用(这个本地变量)是在线程栈中,而引用的对象本身则是在堆中;

一个对象的方法内部的本地变量,仍然是在线程栈中的,即使方法所属的对象是在堆上;

一个对象的成员变量是在堆上,不管该变量是原始类型还是引用类型;

静态成员变量跟随类的定义一起存在堆上;

每个线程都有自己的工作内存,工作内存中保存了线程使用到的主内存中变量的副本

线程对变量的操作(读取、修改等)都必须在工作内存中进行,不能直接操作主内存

线程之间的值传递只能通过主内存来完成;不同线程之间无法访问对方的工作内存

协议
操作解释作用域说明
lock锁定主内存把一个变量表示为线程独占的状态
unlock解锁主内存把一个变量从线程独占的状态释放出来,释放后的变量才能被其他线程锁定
read读取主内存把一个变量从主内存传输到工作内存中
load载入工作内存把read操作的变量值放入工作内存的变量副本中
use使用工作内存把工作内存中的变量传递到执行引擎。当虚拟机遇到需要使用该<br />变量值的字节码指令时执行此操作
assign赋值工作内存把执行引擎来的值赋给工作内存的变量。当虚拟机遇到给变量赋值<br />的字节码指令时执行此操作
store存储工作内存把变量的值传到主内存
write写入主内存把store操作的值放到主内存的变量中

不允许read和load、store和write单独出现,即不允许变量从主存读取了但是工作内存不接受的情况;不允许从工作内存写回了但主存不接受的情况

不允许一个线程丢弃它最近的assign操作,即变量在工作内存修改后,就必须同步回主存

不允许一个线程无原因的把数据从线程的工作内存同步回主存,即没有assign就不允许写回主存

一个新的变量只能在主存中创建,不允许在工作内存中使用一个违背初始化的变量,即要use必须load,要store必须assign

一个变量在同一时刻只允许一个线程进行lock,但一个线程可以执行多次lock操作,多次lock后,必须执行相同次数的unlock,变量才能解锁

没有lock就不能unlock,也不允许unlock由其他线程锁住的变量

对变量unlock时,必须先把变量同步回主存,即store、wirte

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值