Java内存模型_基础

线程之间的通信机制有两种:

1、共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式的通信。

2、消息传递:线程之间没有公共状态,线程之间必须发送消息来显示的进行通信

同步:是指程序中用于控制不同线程间操作发生相对顺序的机制。

在共享内存并发模型里,同步是显式进行的。程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。在消息传递的并发模型里,由于消息的发送必须在消息的接收之前,因此同步是隐式进行的。

Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式进行

 

在java中,所有实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享。局部变量,方法定义参数和异常处理器参数不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响

内存不可见:是用于共享变量的值,没有及时刷新到主内存当中

 

Java内模型抽象结构示意图,如下

线程A与线程B之间要通信的话,必须要经历下面两个步骤。

1、首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。

2、然后,线程B到主内存中去读取线程A之前已更新过的共享变量。

这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证

 

写缓冲区:它可以保证指令流水线持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟

处理器上的写缓存区,仅仅对它所在的处理器可见。这对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的读/写操作顺序一致

从内存操作实际发生的顺序来看,直到处理器A执行A3来刷新自己的写缓存区,写操作A1才算真正执行了。虽然处理器A执行内存操作的顺序为:A1->A2,但内存操作实际发生的顺序却是:A2->A1。此时,

处理器A的内存操作顺序被重排序了

 

为了保证内存可见性,java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。JMM把内存屏障指令分为下列四类:

屏障类型指令示例说明
LoadLoad BarriersLoad1; LoadLoad; Load2确保Load1数据的装载,之前于Load2及所有后续装载指令的装载。
StoreStore BarriersStore1; StoreStore; Store2确保Store1数据对其他处理器可见(刷新到内存),之前于Store2及所有后续存储指令的存储。
LoadStore BarriersLoad1; LoadStore; Store2确保Load1数据装载,之前于Store2及所有后续的存储指令刷新到内存。
StoreLoad BarriersStore1; StoreLoad; Load2确保Store1数据对其他处理器变得可见(指刷新到内存),之前于Load2及所有后续装载指令的装载。StoreLoad Barriers会使该屏障之前的所有内存访问指令(存储和装载指令)完成之后,才执行该屏障之后的内存访问指令。

StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他三个屏障的效果。现代的多处理器大都支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂贵,因为当前处理器通常

要把写缓冲区中的数据全部刷新到内存中。

 

happens-before:在JMM中,如果一个操作需要对另外一个操作可见,那么这两个操作(可以在同一个线程之内,也可以不在同一个线程之内)之间必须要存在happens-before关系。

happens-before规则:

  • 程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
  • 监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
  • volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。
  • 传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。

两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行!happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前。

 

有了这些基础之后,我们在继续往下分析

 

 

 

  

 

转载于:https://www.cnblogs.com/prayers/p/7478668.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

警惕Oracle DB操作高压线

在日常的数据库技术支持工作中,会发现相当部分的数据库事故和人为操作不当有直接的关系。每次的新员工培训,也会用真实案例来说明和强调正确操作习惯的重要性。在强调职业化,推行可服务性的大环境下,了解数据库操作的高压线&#…

centos 宝塔面板 mongodb 设置用户账号密码登录

挂在网上的mongodb测试数据库,默认的无密码,端口直接登录,本来想着不会有人盯上吧,结果,一个月后,被黑客删库了,所以不管是接口,还是数据库的安全性一定要保证!&#xff…

android 日期选择器

//出生年月设置 private void birthSetting() {Calendar calendar Calendar.getInstance();calendar.add(Calendar.DAY_OF_YEAR, 1);new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() {Overridepublic void onDateSet(DatePicker view, int year, in…

启动activity的标准的action常量及对应的字符串

转载于:https://www.cnblogs.com/ouyangping/p/7481700.html

数据批量导入Oracle数据库

仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL)。现在,我们抛开其理论不谈,用实例来使 您快速掌握SQL*LOADER的使用方法。首先,我们认识一下SQL*LOADER。在NT下&#xff0c…

mongoose 通过账号密码连接 Error: Password contains an illegal unescaped character

mongoose 远程连接,我的密码有乱七八糟的字符,报错Error: Password contains an illegal unescaped character 报错的 mongodb: mongodb://c666:buyaokan###ccav.com:27017/zh_db,改成下面,就好啦 mongodb: mongodb:// encodeURIComponent(…

android 省市区选择器

demo1链接:https://download.csdn.net/download/meixi_android/10819638 效果1——跳页全屏式地区选择器: demo2链接:https://download.csdn.net/download/meixi_android/10823744 样式2——dialog市区选择器: 实现方法&#xf…

CCF - 201703-1 - 分蛋糕

问题描述 试题编号: 201703-1试题名称: 分蛋糕时间限制: 1.0s内存限制: 256.0MB问题描述:   小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n&#…

mongoose Topology was destroyed 处理

在用 node 的 mongoose 模块操作 mongodb 数据库的时候,本来正常返回数据,但是有时候会返回空白页,控制台里报错: Topology was destroyed数据库连接代码如下: var mongoose require(mongoose); mongoose.connect(m…

windows 下oracle 数据库 rman 备份

明确目标编写rman批处理文件 目标: A 每天夜间2点执行备份 B数据库全备,同时备份控制文件及归档日志文件,备份文件保存至:F:\backup\目录下,并在完成归档日志文件备份后,自动删除已备份的归档日志&#xff…

android xml 解析

创建xml 文件 <root><province name"安徽省"><city name"安庆市"><district name"枞阳县" zipcode"246000" /><district name"大观区" zipcode"246000" /><district name"…

js触发点击事件

最简单的触发单击事件肯定是elem.click()&#xff0c;平时在不需要考虑兼容性的场合我都是这么干的&#xff0c;但是毕竟这个方法有兼容性&#xff08;具体兼容性如何没做过测试&#xff09;&#xff0c;所以还是要掌握一个通用的方法。 以下代码是网上比较容易找到的一段代码&…

MacOS 升级后出现 xcrun: error: invalid active developer path, missing xcrun

升级macOS mojove&#xff0c;终端里使用git的时候&#xff0c;弹出一行莫名其妙的错误&#xff1a; xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun解决方法&am…

windows系统下oracle数据库rman备份记录(实战篇)

在windows 2003系统中装了oracle10G数据库&#xff0c;同时建了多个实例&#xff0c;这个备份应该怎么做呢&#xff1f; 在网上查了N多的资料&#xff0c;终于了解了一些&#xff1a; 冷备&#xff1a;把数据库已执行关闭后&#xff0c;对数据库做全备&#xff1b;需要停机&…

mac mongodb 安装

1、进入目录 cd /usr/local2、下载对应版本 sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.3.tgz3、解压到当前目录 sudo tar -zxvf mongodb-osx-x86_64-3.4.2.tgz4、重命名为mongodb&#xff0c;主要是方便管理 sudo mv mongodb-osx-x86_64-4.…