前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >详解Java内存模型

详解Java内存模型

作者头像
程序员阿杜
发布2021-08-03 15:53:05
5160
发布2021-08-03 15:53:05
举报
文章被收录于专栏:开源君开源君

文章已同步至GitHub开源项目: JVM底层原理解析

Java内存模型

​ JVM虚拟机规范中曾经试图定义一种Java内存模型,来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都可以达到一致性的内存访问效果。

​ 然而定义这样一套内存模型并非很容易,这个模型必须足够严谨,才能让Java的并发内存访问操作不会有歧义。但是也必须足够宽松,这样使得虚拟机的具体实现能够有自由的发挥空间来利用各种硬件的优势。经过长时间的验证和弥补,到了JDK1.5(实现了JSR133规范)之后,Java内存模型才终于成熟起来了。

主内存和工作内存

​ Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程都有自己的工作内存(Work Memory)

  • 工作内存中保存了被该线程使用的变量的主内存副本,
  • 线程对变量的读写操作必须在工作内存中进行。
  • 而不能直接访问主内存的数据。
  • 不同的线程也不能互相读写对方的工作内存,线程之间的变量传递必须通过主内存传递。
image-20210731210337786
image-20210731210337786

主内存和工作内存的交互

Java内存模型定义了如下八种操作(每一种操作都是原子的不可再分的)

  • lock 锁定: 作用于主内存,将一个变量标识为线程独占状态
  • unlock: 解锁 : 作用于主内存,将一个线程独占状态的变量释放
  • read 读取 : 从主内存读取数据到工作内存,便于之后的load操作
  • load 载入: 把read读取操作从主内存中得到的变量放入工作内存的变量副本中
  • use 使用: 将工作内存中的变量传递给执行引擎 当虚拟机遇到一个需要使用变量值的字节码时,执行此操作
  • assign赋值: 将执行引擎中的值赋给工作内存的变量。 当虚拟机遇到一个赋值操作时,执行此操作
  • store存储: 将工作内存的值传递到主内存 ,便于之后的write操作
  • write写入:将store存储操作中从工作内存中获取的变量写入到主内存中

举例:

  • 如果要把一个变量从主内存拷贝到工作内存,则依次执行read读取操作, load载入操作
  • 如果要把一个变量从工作内存写入到主内存,则依次执行store存储操作,write写入操作

上述的8种操作必须满足以下规则:

  • 不允许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操作)。

volatile特殊规则

​ volatile可以说是Java虚拟机提供的最轻量级的同步机制。但是它并不容易被正确,完整的理解。

​ Java内存模型中规定

​ 当一个变量被定义为volatile之后,表示着线程工作内存无效,对此值的读写操作都会直接作用在主内存上,

因此它具备对所有线程的立即可见性

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java内存模型
    • 主内存和工作内存
      • 主内存和工作内存的交互
        • Java内存模型定义了如下八种操作(每一种操作都是原子的,不可再分的)
        • 举例:
        • 上述的8种操作必须满足以下规则:
      • volatile特殊规则
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档