• <menu id="ywm6y"></menu>
    <input id="ywm6y"></input>
    <menu id="ywm6y"><code id="ywm6y"></code></menu>
    <input id="ywm6y"><acronym id="ywm6y"></acronym></input>
  • <menu id="ywm6y"></menu>
  • <menu id="ywm6y"></menu>
  • <input id="ywm6y"></input>
    <input id="ywm6y"></input>

    十二、深入理解Java内存模型

    深入理解Java内存模型

    【1】CPU和缓存的一致性

    img

    ? 我们应该都知道,计算机在执行程序的时候,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道。而计算机上面的数据,是存放在主存当中的,也就是计算机的物理内存啦。

    ? 刚开始,还相安无事的,但是随着CPU技术的发展,CPU的执行速度越来越快。而由于内存的技术并没有太大的变化,所以从内存中读取和写入数据的过程和CPU的执行速度比起来差距就会越来越大,这就导致CPU每次操作内存都要耗费很多等待时间。

    ? 所以,人们想出来了一个好的办法,就是在CPU和内存之间增加高速缓存。缓存的概念大家都知道,就是保存一份数据拷贝。他的特点是速度快,内存小,并且昂贵。

    那么,程序的执行过程就变成了:

    当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。

    ? 在CPU和主存之间增加缓存,在多线程场景下就可能存在缓存一致性问题,也就是说,在多核CPU中,每个核的自己的缓存中,关于同一个数据的缓存内容可能不一致。

    【2】处理器优化和指令重排

    上面提到在在CPU和主存之间增加缓存,在多线程场景下会存在缓存一致性问题。除了这种情况,还有一种硬件问题也比较重要。那就是为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序执行处理。这就是处理器优化

    除了现在很多流行的处理器会对代码进行优化乱序处理,很多编程语言的编译器也会有类似的优化,比如Java虚拟机的即时编译器(JIT)也会做指令重排

    可想而知,如果任由处理器优化和编译器对指令重排的话,就可能导致各种各样的问题。

    解决方法:内存屏障

    【3】什么是Java内存模型

    内存模型

    为了保证共享内存的正确性(可见性、有序性、原子性),内存模型定义了共享内存系统中多线程程序读写操作行为的规范。通过这些规则来规范对内存的读写操作,从而保证指令执行的正确性。

    Java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。

    img

    ? Java内存模型的主要目标是定义程序中变量的访问规则。即在虚拟机中将变量存储到主内存或者将变量从主内存取出这样的底层细节。需要注意的是这里的变量跟我们写java程序中的变量不是完全等同的。这里的变量是指实例字段,静态字段,构成数组对象的元素,但是不包括局部变量和方法参数(因为这是线程私有的)。

    Java内存模型中涉及到的概念有:

    • 主内存:java虚拟机规定所有的变量(不是程序中的变量)都必须在主内存中产生。可以与前面说的物理机的主内存相比,只不过物理机的主内存是整个机器的内存,而虚拟机的主内存是虚拟机内存中的一部分。
    • 工作内存:java虚拟机中每个线程都有自己的工作内存,该内存是线程私有的。可以与前面说的高速缓存相比。线程的工作内存保存了线程需要的变量在主内存中的副本。虚拟机规定,线程对主内存变量的修改必须在线程的工作内存中进行,不能直接读写主内存中的变量。不同的线程之间也不能相互访问对方的工作内存。如果线程之间需要传递变量的值,必须通过主内存来作为中介进行传递。

    工作内存和主内存的划分和 Java 堆,栈,方法区的划分不同,两者基本没有关系,如果勉强对应,则主内存可理 解为堆中实例数据部分,工作内存则对应栈中部分区域

    关于Java 堆,栈,方法区:点击学习

    【4】volatile的内存语义

    volatile写的内存语义:
    当写一个变量的时候,JMM会把该线程的私有内存中的共享变量值更新到主内存中,并将其他线程中的值置为无效的;
    volatile读的内存语义:
    当读一个变量的时候,JMM会先判断是否私有空间内的值是否失效,若失效,线程接下来会从主存中读取变量。

    详情见:点击学习

    【5】锁的内存语义

    当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。

    当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量。

    详情见:点击学习

    相关文章
    相关标签/搜索
    香港2019年六开彩资料精选 页游| 泾川县| 天长市| 大新县| 普洱| 天峨县| 云阳县| 宜春市| 建始县| 湾仔区| 灵寿县| 武邑县| 吉水县| 贵定县| 大荔县| 重庆市| 莱阳市| 新蔡县| 朝阳区| 中方县| 白银市| 望城县| 洞口县| 二连浩特市| 靖州| 垣曲县| 东海县| 百色市| 新郑市| 罗田县| 鲜城| 白山市| 民权县| 青龙| 北海市| 巴林左旗| 滦南县| 大同市| 康平县| 綦江县| 德阳市| 连南| 建德市| 塔城市| 武威市| 茌平县| 英超| 明星| 托克逊县| 吕梁市| 阆中市| 阿拉善盟| 重庆市| 哈巴河县| 龙江县| 巩义市| 社旗县| 赞皇县| 乌鲁木齐县| 新河县| 温宿县| 东阳市| 英山县| 华阴市| 高碑店市| 林芝县| 米泉市| 建始县| 恩平市| 澄江县| 南和县| 明星| 定陶县| 通渭县| 炉霍县| 樟树市| 阿拉尔市| 香河县| 大邑县| 镇康县| 涿州市| 塔河县| 昌图县| 唐山市| 闽侯县| 漳浦县| 遵义县| 石阡县| 孙吴县| 迁西县| 广汉市| 鸡泽县| 呼玛县| 慈利县| 湘潭县| 米脂县| 巩留县| 衢州市| 天台县| 廉江市| 莆田市| 朝阳市| 洱源县| 青阳县| 手游| 林芝县| 宣城市| 河北区| 宁阳县| 潜江市| 荣昌县| 钦州市| 巴青县| 桂平市| 瑞安市| 镇雄县| 衡东县| 武邑县| 普定县| 铁岭市| 靖边县| 昔阳县| 青浦区| 台江县| 桂阳县| 惠东县| 重庆市| 铜川市| 澄江县| 江陵县| 四平市| 辰溪县| 鸡泽县| 宁远县| 太原市| 鹤峰县| 巴青县| 灌南县| 九江县| 德江县| 大姚县| 澄江县| 柳州市| 陆河县| 黎川县| 鹤庆县| 渑池县| 裕民县| 新泰市| 银川市| 修武县| 通许县| 郓城县| 福清市| 通河县| 吉水县| 抚松县| 大洼县| 新竹县| 湖南省| 双鸭山市| 宜宾市| 柳河县| 太白县| 西丰县| 屯昌县| 莫力| 越西县| 定边县| 澄城县| 永善县| 北流市| 抚州市| 朝阳区| 荔波县| 合肥市| 门头沟区| 商丘市| 昌平区| 南丹县| 石河子市| 兴隆县| 青州市| 牟定县| 疏勒县| 连江县| 莒南县| 山阴县| 东光县| 伊宁县| 老河口市| 准格尔旗| 通山县| 宜兰县| 武宁县| 东至县| 辉县市| 黄平县| 毕节市| 北流市| 怀集县| 洛川县| 清涧县| 罗江县| 泰兴市| 杨浦区| 特克斯县| 罗田县| 汤原县| 醴陵市| 吴桥县| 凌云县| 措勤县| 镇宁| 平乐县| 义马市| 宾阳县| 新密市| 胶南市| 平邑县| 镇平县| 金寨县| 眉山市| 万全县| 南岸区| 宝坻区| 阳谷县| 天等县| 万源市| 巧家县| 外汇| 浦县| 明水县| 通州市| 高淳县| 新源县| 韶山市| 台州市| 万全县| 乐昌市| 手游| 峨边| 大姚县| 安新县| 福州市| 田阳县| 佛山市| 德庆县| 湖南省| 吉安市| 汉川市| 拜泉县| 绥江县| 余江县| 博湖县| 巩义市| 扶风县| 巴彦淖尔市| 四川省| 龙南县| 原阳县| 郴州市| 淄博市| 巨鹿县| 都安| 汕头市| 沂源县| 宝鸡市| 钦州市| 白山市| 慈利县| 华池县| 东台市| 孝昌县| 麻江县| 潞西市| 喀喇沁旗| 屏边| 定日县| 岑溪市| 绥宁县| 石狮市| 宁城县| 宝鸡市| 永康市| 拉萨市| 禹州市| 水城县| 冷水江市| 建水县| 北安市| 阜宁县| 东兴市| 额敏县| 客服| 修文县| 河池市| 宜丰县| 安丘市| 大田县| 定州市| 正安县| 漯河市| 台东市| 大足县| 左权县| 潍坊市| 汶川县| 尼勒克县| 无极县| 横峰县| 怀宁县| 邹城市| 桐庐县| 综艺| 凭祥市| 汶川县| 潍坊市| 徐州市| 彝良县| 清苑县| 公安县| 油尖旺区| 大石桥市| 随州市| 罗江县| 神木县| 大关县| 渝北区| 望江县| 界首市| 泗水县| 湘潭市| 双鸭山市| 柳江县| 普兰店市| 五华县| 屯留县| 玉山县| 云南省| 大宁县| 临桂县| 巴里| 扎囊县| 泽普县| 板桥市| 肃宁县| 无锡市| 河东区| 蓬安县| 邹平县| 海晏县| 根河市| 大新县| 承德县| 临邑县| 江孜县| 文化| 长岭县| 永福县| 巴马| 峨眉山市| 汝城县| 达拉特旗| 大理市| 汨罗市| 安平县| 会理县| 抚州市| 湄潭县| 平湖市| 上杭县| 清镇市| 景东| 韩城市| 镇宁| 宝鸡市| 恩平市| 樟树市| 全南县| 东阳市| 鹿泉市| 米易县| 肥西县| 金塔县| 佛山市| 格尔木市| 建平县| 从江县| 清苑县| 肥东县| 连城县| 龙海市| 茌平县| 沛县| 屏东县| 江孜县| 曲靖市| 阳朔县| 朝阳县| 盐亭县| 五原县| 会理县| 固阳县| 光泽县| 佛坪县| 锡林浩特市| 九龙坡区| 佛冈县| 公安县| 泗阳县| 淳安县| 新巴尔虎左旗| 宝丰县| 龙江县| 特克斯县| 平邑县| 邮箱| 济阳县| 连南| 内丘县| 资兴市| 鄯善县| 临汾市| 南昌县| 诏安县| 宜丰县| 靖西县| 双峰县| 沁阳市| 崇阳县| 绥化市| 邯郸县| 昆明市| 平舆县| 永清县| 盈江县| 潞城市| 缙云县| 开远市| 昆山市| 万年县| 内乡县| 长岛县| 梓潼县| 阳新县| 马鞍山市| 黄浦区| 永清县| 岳池县| 富阳市| 故城县| 渝中区| 宿松县| 铜陵市| 河池市| 东乡族自治县| 长兴县| 琼海市| 林周县| 时尚| 年辖:市辖区| 临西县| 高邑县| 师宗县| 沾化县| 泊头市| 平昌县| 安阳市| 吉隆县| 晋中市| 监利县| 安平县| 青岛市| 河源市| 元阳县| 军事| 达尔| 峨眉山市| 新丰县| 九台市| 连南| 肥西县| 陇川县| 清流县| 元朗区| 江门市| 红河县| 西城区| 开封市| 赤水市| 山东| 庆城县| 英超| 仁怀市| 惠安县| 土默特右旗| 闽清县| 大兴区| 麻江县| 林口县| 上林县| 都兰县| 桦川县| 开江县| 佛学| 民丰县| 通辽市| 托克托县| 林西县| 福海县| 武隆县| 南陵县| 唐山市| 隆德县| 钟祥市| 鹤壁市| 博野县| 大竹县| 大兴区| 双鸭山市| 枣阳市| 施甸县| 东乌| 车险| 霍城县| 平罗县| 聂荣县| 潢川县| 嵊泗县| 永清县| 临夏县| 光山县| 唐海县| 湛江市| 方正县| 广水市| 岗巴县| 沙河市| 扬州市| 高唐县| 阳信县| 德州市| 青州市| 江都市| 永和县| 扶余县| 郧西县| 佳木斯市| 宝鸡市| 蓝山县| 双鸭山市| 甘肃省| 高要市| 山东| 嵊泗县| 丹寨县| 双城市| 株洲市| 东源县| 嘉鱼县| 鹤峰县| 江门市| 民县| 治多县| 玉山县| 新巴尔虎右旗| 桂阳县| 通州市| 白朗县| 普兰店市| 长阳| 阿拉善左旗| 中方县| 城固县| 漠河县| 桦川县| 休宁县| 淮阳县| 沁阳市| 霍林郭勒市| 宝山区| 扬州市| 河西区| 安塞县| 长兴县| 敦煌市| 平和县| 锦屏县| 兴和县| 谷城县| 宝鸡市| 天祝| 韶关市| 旬阳县| 河东区| 藁城市| 霍城县| 隆德县| 高雄县| 玛沁县| 江油市| 临沭县| 孟津县| 民勤县| 孝感市| 大埔区| 吉林省| 建阳市| 横山县| 安平县| 建昌县| 海城市| 绍兴县| 新建县| http://jx1870actv.fun http://m.jx1870dezandv.fun http://wap.jx1870cockv.fun http://m.jx1870cruisev.fun http://3g.jx1870concernv.fun http://m.jx1870clickv.fun http://3g.jx1870cozzentv.fun http://wap.jx1870battlev.fun http://wap.jx1870drugv.fun http://3g.jx1870castlev.fun http://wap.jx1870bargainv.fun http://3g.jx1870airv.fun http://m.jx1870cozpactv.fun http://3g.jx1870carev.fun http://m.jx1870eatv.fun http://m.jx1870ezptyv.fun http://m.jx1870characterv.fun http://m.jx1870costv.fun