JVM-并发-Java 内存模型

 Java内存模型

    (1). 主内存与工作内存

      Java内存模型规定了所有的变量都存储在主内存中.

      每类线程的变量的主内存副本拷贝,线程对变量的所有操作(读操作,赋值操作等)都必须工作内存中进行,而不能直接读写主内存中的变量.

      不同的线程之间无法直接访问对方工作内存中的变量,线程间变量的传递均需要通过主内存来完成.

    (2)内存之间额操作

      主内存与工作内存交互,Java内存模型定义了8种操作来完成.

      a)lock(锁定):作用于主内存的变量,它把一个变量标识为一条线性独占的状态.

      b)ublock(解锁):作用于主内存的变量,它把一个处于锁状态的变量释放出来,释放后的变量才可以被其他线程锁定.

      c)read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的内存中,以便随后的load动作使用.

      d)load(载入):作用于内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中.

      e)use(使用):作用于工作内存中的变量,它把工作内存中的一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作.

      f)assign(赋值):作用于工作内存中的变量,它把一个执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作.

      g)store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传递到主内存中,以便随后的write操作使用.

      h)write(写入):作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入到主内存的变量中.

     (3)Java内存模型规定了在执行上述8种基本操作时必须满足如下规则:

      a) 不允许read和load,store和write操作之一单独出现,既不允许一个变量从主存读取了但是工作内存发起回写不接受的情况出现

      b) 不允许一个线程丢弃它的最近的assign操作,即变量在工作内存中改变了之后必须把变量同步到主内存

      c) 不允许一个线程无原因(没有发生过任何assign操作)把数据从线程的工作内存同步会主内存

      d) 一个新的变量只能在主内存中“诞生”,不允许在工作内存中直接使用一个未被初始化的变量,换句话说就是 对一个变量实施use,store操作之前,必须执行过了assign和load操作

      e) 一个人变量在同一时刻只允许一条线程对其进行lock操作可以被同一条线程重复执行多次,多次执行lock后,只有执行相同德尔unlock操作,变量才会被解锁

      f) 如果一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值

      g) 如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许unlock一个被其他线程锁定的变量

      h) 对一个变量执行unlock操作之前,必须先把此变量同步会煮主内存(执行store,write操作)

    (4)对于volatile型变量的特殊规则:
      a) 只能保证可见性

      b) 禁止指令重排序优化

    (5)对long和double型变量的特殊规则:

      a) Java内存模型规定:允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位操作进行,及允许虚拟机实现选择可以不保证64位数据类型的load,store,read和write这4个操作的原子性。这就是long和double的非原子性协定

    (6)原子性、可见性与有序性

      原子性:由Java内存模型来直接保证的原子性变量操作包括read,load,assign,use,store和write

      可见性:指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改

      有序性:如果在本线程内观察,所有的操作都是有序的,如果在一个线程中观察另一个线程,所有的操作都是无序的

    (7)先行发生原则

      先行发生时Java内存模型中定义的两项操作之间的关系,如果说操作A先行发生于操作B,其实就是在发生操作B之前,操作A产生的影响能够被操作B观察到。“影响”包括修改了内存中共享变量的值,发送了消息,调用了方法等。

      程序次序规则:在一个线程内,按照程序代码顺序,书写在前面的操作先于发生在书写在后面的操作。准确的说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。

      管程锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。

      volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的“后面”是指时间上的先后顺序

      线程启动规则:Thread对象的start方法先行发生于此线程的每一个动作

      线程终止规则:线程中的所有操作都先于此线程的终止检测,我们可以通过Thread.join()方法结束。THread.Alive()的返回值等手段检到线程已经终止执行

      线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生

      对象终结规则:一个对象的初始化完成(构造函数执行结束)先行发生于它的finalize()方法的开始

      传递性:如果操作A先行发生于操作B,操作B先行发生于操作C,那就得出操作A先行发生于操作C的结论

转载于:https://www.cnblogs.com/lrh-xl/p/5364349.html

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

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

相关文章

(七)python3 只需3小时带你轻松入门——List与dict

List列表 python中最基本的数据结构之一。序列(或者说集合)中的每个元素都分配一个数字用来表示它的位置(索引),第一个索引是0,第二个索引是1,依此类推。 索引 索引最大值不能超过当前对象的最…

龙芯推出兼容IE的龙芯浏览器解决方案,全面支持ActiveX插件等应用类型

近期,龙芯中科推出了兼容IE的浏览器解决方案,可全面支持采用ActiveX插件等IE时代技术开发的网页应用。众所周知,IE浏览器因年代久远,已逐步退出历史舞台。但在我国行业和个人应用中,仍存在着大量基于IE浏览器开发的网页…

DPS软件做MK(Mann-Kendall)突变监测分析方法(附DPS 7.05软件下载地址)

Mann-Kendall是一种非参数统计检验方法,具有样本不遵从某一特定分布,不受个别异常值干扰,能够客观地表征样本序列整体变化趋势等优点。 虽然DPS软件具有强大的统计分析和数据可视化功能,但是相关的示例和教程却本博文演示Mann-Ke…

linux之ftp怎么把本地文件拷贝到服务端

1 问题 电脑本地文件怎么通过ftp拷贝到服务端 2 解决办法 我们可以用put命令 put file_path 那我们怎么解决把服务端的文件拷贝到本地呢?很明显啊,我们可以使用get命令 get file_path

clientHeight、offsetHeight 和 scrollHeight

2019独角兽企业重金招聘Python工程师标准>>> window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏幕高度(空白空间) window.screen.width 返回当前屏幕宽度(分辨率值) window.screen.height 返回当前屏幕…

计算机应用怎么拼写,计算机应用本科论文提纲格式范文 计算机应用本科论文提纲如何写...

精选了【100个】关于计算机应用本科论文提纲格式范文供您后续的写作参考,在写计算机应用本科论文之前,很多大学生总是被计算机应用本科论文提纲如何写难倒怎么办?请阅读本文!五、我国体育院校体育教育专业本科体育信息技术课程体系的构建研究论文提纲中文摘要abstr…

tcpdump 如何kill_如何用tcpdump命令过滤掉一部分的数据包(需用tcpdump命令将截获的信息过滤。)...

你的位置:问答吧-> Linux-> 问题详情如何用tcpdump命令过滤掉一部分的数据包(需用tcpdump命令将截获的信息过滤。)共享上网,需知道各客户端浏览网页时有那些连接是有效的。例:tcpdump -i ppp0 src host 192.168.0.3 and dst port 80那么就可以将所…

jquery send(data) 对data的处理

// Convert data if not already a string if ( s.data && s.processData && typeof s.data ! "string" ) {s.data jQuery.param( s.data, s.traditional ); } 转载于:https://www.cnblogs.com/chenxijywc/p/5377531.html

(八)python3 只需3小时带你轻松入门——List 与 dict 的常用操作

List定义 定义:list1 [name,python,sun,dog] list获取:list1[0]->name,list1[3]->sun list修改:list1[0],list1[3]Lihua,run list输出: print(list[0]) 检验代码: list1 [name,python,sun,dog] print(list1获取索引0位置:,list1[0]) list1[0],l…

几何校正,正射校正,影像配准,辐射定标,辐射校正,大气校正,地形校正概念详解

一、几何校正 1、概念 是指消除或改正遥感影像几何误差的过程;

如何用 foreach 遍历方法中的所有参数?

咨询区 Farhad请问是否有办法可以遍历某个方法的 参数列表 中是否有 null 的情况,比如下面这样的伪代码:public void test (string arg1, string arg2, object arg3, DataTable arg4) {foreach (var item in argus){if( item null){throw;}}// do the r…

linux之errno值为104(connetction reset by peer)

1 问题 往fd里面写(write方法)入数据的时候出错,返回小于等于0的值,然后这个时候打印errno值是104 2 分析 errno是104就是connetction reset by peer,表明在对一个对端socket已经关闭的的连接调用write或send方法&am…

python 蓝牙模块pybluz安装

最近项目运用了蓝牙,所以来学一学蓝牙。 经过查阅,知道python的蓝牙模块是pybluz,然后老管理进行安装 出错,提示“Could not find the Windows Platform SDK” 到https://pypi.python.org/pypi/PyBluez 下载码源 查看setup.py 出错…

eclise配置tomcat出现服务Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4 and Java EE 5 Web modules...

当部署项目Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, 1.5 and Java EE 5 Web modules错;解决方案&#xff0c;如下面: 空间项目下的.settings以下&#xff0c;有个名为org.eclipse.wst.common.project.facet.core.xml的文件。里面配置有各种版本号信息: <?xml…

用计算机算出鞋子的鞋码,【鞋子尺码对照】鞋子尺码怎么算_鞋子尺码怎么量 - 妈妈网百科...

谁年轻的时候没有遇见过几个渣男&#xff1f;没有买错过几双不合尺码的鞋子&#xff1f;渣男无法巧避&#xff0c;但是买到不合尺码的鞋子这样的囧事倒是可以有效避免的。下面一起来了解下鞋子尺码的量法吧。工具&#xff1a;纸张、笔步骤&#xff1a;1、赤脚踩在白纸上&#x…

amap vueamap 与_在vue中使用高德地图vue-amap

1.安装vue-amap我安装指定版本0.5.10的版本npm i --save vue-amap0.5.102.main.js中的配置// 高德离线地图import VueAMap from vue-amap;Vue.use(VueAMap);VueAMap.initAMapApiLoader({// 高德keykey: d6eabbd08f89ccfb74278b36ab6342567, // 自己到官网申请&#xff0c;我随便…

WebRTC 音频模块单独编译 --【转载】

原文地址&#xff1a;http://billhoo.blog.51cto.com/2337751/1213801 【2015年2月15日】 Bill 这段时间没有再关注 WebRTC 以及音频处理的相关信息&#xff0c;且我个人早已不再推荐单独编译 WebRTC 中的各个模块出来使用。实际上本文的参考价值已经很小了&#xff0c;甚至可能…

【ArcGIS风暴】ArcGIS 10.2字段计算器(Field Calculator)批量条件赋值用法总结

前面的文章介绍了栅格计算器的常见公式大全可以参照文章《【ArcGIS风暴】ArcGIS 10.2栅格计算器实用公式大全(经典珍藏版)》。可以看出,栅格计算器的熟练运用的确能解决很多栅格运算的问题。 现在有这么一类典型问题,就是如果需要按不同的条件进行赋值,该怎么做呢?我们是…

(九)python3 只需3小时带你轻松入门——函数自定义

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 无返回值无参函数自定义 你可以定义一个由自己想要功能的函数&#xff1a; 函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和圆括号 ()函数内容以冒号…

linux之通过grep使用or、and、not操作

1 问题 linux之如何再搜索结果上过滤关键字1或者关键字2 2 解决办法 grep -P *** 这个的P是正则表达式的意思&#xff0c; 比如我们需要在当前目录下过滤文件 1.txt和2.txt,命令如下 ll -rw-r--r-- 1 root root 0 Jul 11 23:01 1.txt -rw-r--r-- 1 root root 0 Jul 11 23:01…