范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

深入理解JMM及JVM内存模型知识体系机制

  并发编程的难题和挑战
  在并发编程的技术领域中,对于我们而言的难题主要有两个:多线程之间如何进行通信和线程之间如何同步,通信是指线程之间以何种机制来交换信息。多线程的线程通信机制
  在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。共享内存的方式,多线程之间共享公共的状态(变量),那么线程之间通过写/读内存中的公共状态(变量)来隐式进行通信。在此模式下,同步实现是隐式进行的,由于消息的发送必须在消息的接收之前。消息传递的方式,多线程之间没有公共的状态(变量),那么线程之间必须通过明确的传递状态(变量)来显式进行通信。在此模式下,同步实现是显式进行的,必须显式指定某个方法或某段代码需要在线程之间互斥执行。Java中的同步模式是什么?
  同步机制是指程序用于控制不同线程之间操作发生相对顺序的机制。
  Java生态中的并发编程模型采用的是共享内存模型,因此在Java线程之间的通信总是隐式进行, 整个通信过程对开发者是黑盒的,如果编写多线程程序的开发者不深入理解这种隐式模式下的线程之间通信机制,就会会出现内存可见性和一致性的问题,我们统称为线程不安全问题。存在内存可见问题
  Java应用程序中, 所有实例域、静态域和数组元素存储在堆内存中, 堆内存在线程之间共享。会存在这内存可见性问题。不存在内存可见问题
  局部变量(Local variables) , 方法定义参数(java语言规范称之为formal method parameters) 和异常处理器参数(exception handler parameters) 不会在线程之间共享,它们不会有内存可见性问题,也不受内存模型的影响。
  所以,我们在开发多线程场景下的程序的时候主要需要关注的就是内存可见问题变量,包含:实例域、静态域和数组元素。
  而为了降低并发编程的难度和门槛,这些线程之间的数据同步和通信控制就交由一个特定的数据模型进行控制和管理,我们称之为Java内存模型(JMM)。Java内存模型(JMM)
  JMM决定在程序运行中,一个线程对共享变量的写入何时对另一个线程可见。JMM定义了线程和主内存之间的抽象关系
  线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存 , 本地内存中存储了该线程以读/写共享变量的副本。
  本地内存是JMM的一个抽象概念, 并不真实存在。它涵盖了缓存, 写缓冲区, 寄存器以及其他的硬件和编译器优化。
  Java 内存模型的抽象示意图如下:
  由上图可见,线程A与线程B之间如要数据通信,需要有以下两个步骤:线程A把本地内存A中更新过的共享变量刷新到主内存中去。线程B到主内存中去读取线程A之前已更新过的共享变量。
  下面通过示意图来说明这两个步骤:
  如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值,临时存放在自己的本地内存A中。线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变了。线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变了。
  总结一下就是,这两个步骤数据角度而言是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互, 来为程序提供内存可见性保证。线程不安全因素之一(指令重排序问题)
  基于上述所说的场景之下,JVM为了在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。在此我们将按照重排序的执行时间前后分为重排序分三种类型,如下图所示。
  第一步属于编译器重排序:编译器优化的重排序,编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。第二步属于处理器重排序:指令级并行的重排序,现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP) 来将多条指令重叠执行。如果不存在数据依赖性, 处理器可以改变语句对应机器指令的执行顺序。第三步属于处理器重排序:内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行,此处特别是针对与本地内存和共享主存之间的更新操作的一致性和可见性
  这些重排序都可能会导致多线程程序出现内存可见性问题。JMM解决重排序的线程不安全问题解决编译器级别重排序JMM的编译器重排序规则会禁止特定类型的编译器重排序,此处注意:不是所有的编译器重排序都要禁止。解决处理器级别重排序JMM的处理器重排序规则会要求java编译器在生成指令序列时, 插入特定类型的内存屏障(memory barriers, 也可以称之为memory fence)指令, 通过 内存屏障 指令来禁止特定类型的处理器重排序,此处注意:不是所有的处理器重排序都要禁止)。
  总结一下,针对于JMM属于语言级的内存模型, 它确保在不同的编译器和不同的处理器平台之上,通过禁止特定类型的编译器重排序和处理器重排序,从而实现了内存的可见性以及一致性。处理器重排序与内存屏障指令
  上面说了其实是通过插入了内存屏障指令,从而控制住了对应的处理器级别的指令重排。线程不安全因素之一(写缓存处理模式)现代的处理器使用写缓冲区来临时保存向内存写入的数据,写缓冲区可以保证指令流水线持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的多次写,可以减少对内存总线的占用。虽然写缓冲区有这么多好处,但每个处理器上的写缓冲区,仅仅对它所在的处理器可见。
  这个特性会对内存操作的执行顺序产生重要的影响,处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的读/写操作顺序一致。
  处理器A和处理器B可以同时把共享变量写入自己的写缓冲区(A1,B1)从内存中读取另一个共享变量(A2,B2)最后才把自己写缓存区中保存的脏数据刷新到内存中(A3,B3)。
  从内存操作实际发生的顺序来看,直到处理器A执行A3来刷新自己的写缓存区,写操作A1才算真正执行了。虽然处理器A执行内存操作的顺序为:A1->A2,但内存操作实际发生的顺序却是:A2->A1。此时,处理器A的内存操作顺序被重排序了(处理器B的情况和处理器A一样)。
  由于现代的处理器都会使用写缓冲区,因此现代的处理器都会允许对写-读操作重排序。常见的处理器都允许Store-Load重排序,常见的处理器都不允许对存在数据依赖的操作做重排序。内存屏障指令
  为了保证内存可见性, java编译器在生成指令序列的适当位置会插入内存屏障指令来禁止特定类型的处理器重排序。JMM把内存屏障指令分为下列四类:
  内存屏障类型
  指令示例
  备注
  LoadLoad Barries
  Load1LoadLoadLoad2
  确保Load1数据的装载,之前于Load2及所有后续装载指令的装载
  StoreStore Barries
  Store1StoreStoreStore2
  确保Store1数据对其他处理器可见(刷新到内存),之前于Store2及所有后续存储指令的存储。
  LoadStore Barriers
  Load1 LoadStoreStore2
  确保Load1数据装载, 之前于Store2及所有后续的存储指令刷新到内存
  StoreLoad Barriers
  Store1StoreLoadLoad2
  确保Storel数据对其他处理器变得可见(指刷新到内存),之前于Load2及所有后续装载指令的装载。StoreLoad Barriers会使该屏障之前的所有内存访问指令(存储和装载指令)完成之后,才执行该屏障之后的内存访问指令。
  **StoreLoad Barriers是一个"全能型"的屏障, 它同时具有其他三个屏障的效果。现代的多处理器大都支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂贵,因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中(buffer fully flush) **。

河北青龙山桃花盛开春意浓4月5日,阳光透过山桃花枝,浓淡相宜,格外美丽。河北青龙湖国家湿地公园两岸山头数千棵山桃花争相怒放,妆点着湿地公园的春天。山桃花的次第开放,也构成了青龙别样的春日美景,吸引了众多市中国四个奇葩建筑,造型一个比一个辣眼,众多游客前去打卡中国四个奇葩建筑,造型一个比一个辣眼,众多游客前去打卡中国是一个富有创造力的国家,其中曾经引领全球进步的指南针造纸术火药等技术就是来自于我国。除此之外,这里也有着许许多多的奇迹,比体坛这些肌肉真不是P图,泰森脖子像充气吕小军背阔肌似艺术品体坛的肌肉男太多了,特别是那些需要身体对抗或者是吃身体的运动,运动员肌肉出色的太多。但是有些肌肉真的是夸张,看上去让人误以为是P图,今天这些照片就是如此。这是天赋自律训练的成果,想郜林被开除,队长眼眶骨折,85国奥队群殴事件的故事在足球比赛中有时候因为对抗强度太高,比赛中时常会造成犯规,甚至会伤人,也因此足球比赛中爆发冲突的事还是时有发生的,有时候只是简单的口角之争,但是难免会有大打出手的时候,甚至是两支球张怡宁的故事嫁大20岁老公不被看好,如今被宠上天乒乓球是中国的国球,一代一代的国手前赴后继,打造了在国际乒坛上的赫赫威名。一串串耳熟能详的名字上面都闪耀着冠军的光环,当然这里绝对少不了有冷面杀手和大魔王之称的张怡宁。说起张怡宁的冬奥故事向世界传递信心和力量来源人民网人民日报2月11日,北京2022年冬奥会短道速滑项目男子5000米接力半决赛在首都体育馆举行。图为加拿大队队员查尔斯哈梅林(右二)在比赛中。新华社发2月12日,北京202希望詹姆斯来骑士乐福向詹姆斯招手故事的结局随着洛杉矶湖人以110比121败给凤凰城太阳,本赛季确定无缘季后赛,也让此役缺阵的主将詹姆斯未来动向备受瞩目。过去曾一起在克里夫兰骑士共事的乐福形容,就像是故事书的结局。我的意思是一秒之差从奥运舞台摔落,终身残疾,张艺谋愧疚一生的女人还好吗刘岩!刘岩!你怎么样?别动我,疼!快叫救护车!打120!奥运会彩排现场上万人都停下来,被眼前这一幕吓坏了。救护车火速把刘岩送到了最近的医院。这场手术持续6个小时,当刘岩从黑暗中醒来山东跻上末班车,小丁突然被弃用有深意!季后赛才是他的发挥舞台随着昨天新疆男篮输给广东,而山东则争气地拿下了北京首钢,这样一来CBA的12支季后赛球队已经全部诞生,山东男篮虽然一度掉到了前12开外,但好在他们最终还是稳住阵脚,拿到了这张季后赛小棋局大世界东西方象棋中的文化特质作者谢军(国家社科基金重大项目北京2022年冬奥会和冬残奥会遗产助力国家发展战略研究首席专家,首都体育学院副院长北京师范大学兼职教授原国际象棋女子世界冠军)棋文化是见证人类历史文明六零空间,在旅途中释放青春,找回年轻时的自己2022hr狂欢主题LIFESTYLE说走就走,是人生最华美的奢侈,也是最灿烂的自由退休后心怀远方的人,依旧会在内心做好说走就走的准备旅游和旅行最大的区别就在于旅游,仅仅是用双脚和
因滤镜照片被骂上热搜的博主也听听他们自己怎么说出片是为了好看但如果把出片当成旅行指南确实可能会出现一定的落差我们只是在一个免费的公共场所免费的小众景点,凭借自己的审美,拍摄和调整了自己喜爱的相片居然被送上了无数的恶意猜测和质疑紧急通知暂停!暂停10月23日晚文化和旅游部发布紧急通知立即暂停跨省团队旅游业务即日起暂停经营旅游专列业务主要内容如下旅行社旅行社及在线旅游企业不得经营出入境团队旅游和机票酒店业务,不得以任何形式搞三节打卡!开拓者三枪639,保罗411,太阳被吊打,湖人最尴尬今日NBA比赛,太阳客场对战开拓者,太阳是背靠背作战,开拓者则休息多日体力充沛,太阳体能处于劣势。太阳首发保罗布克布里奇斯克劳德艾顿,开拓者首发利拉德麦克勒姆鲍威尔科温顿努尔基奇。三分球10中10!米尔斯589万年薪太香,乔哈学着点NBA常规赛继续进行,76人队主场迎战篮网队。76人几乎是领先了一整场,但末节马刺旧将爆发,最终篮网队成功逆袭,击败了76人队,迎来了赛季首胜。此役双方都各自让了一员大将,欧文依旧建国伊始,四大元帅当了大城市市长,另外六大元帅哪去了?建国后,10位在抗日解放战争中有卓越贡献的将军被选为共和国十大元帅,他们不仅在战争期间发挥出极高的军事才能,还在新中国的建设中继续做出巨大的贡献。十位元帅里,有四位元帅都在新中国成接连发出神秘闪光木星怎么了?木星接连被撞。10月15日,日本天文爱好者发现木星出现闪光。yotsuyubi21这张照片结合了可见光和红外波段的影像数据。KoArimatsu京都大学近一个月内,木星接二连三发出顾不上中国空间站了!美国航天局十年磨一剑,出发第一天就出事了目前中国神舟十三号的三位航天员已经在空间站工作了近一个星期,中国航天的出色表现赢得了全世界媒体的关注和赞扬。对比之下,美国航天局最近显得很低调,没有对中国空间站作出任何官方表态。最宇宙可能是虚拟的,这里有一条另类线索万事万物都有着说不清的关联,冥冥之中似乎真的有命运之手在操控,尤其是当你遇到改变一生的大事时,你会觉得这一切都是注定。下面我们就来研究一下这个命中注定,或许虚拟宇宙就是真相!先来聊推力500吨!中国拿下运载火箭领域的世界第一,这次比美俄更先进今年以来,中国成功发射天问一号火星探测器,又发射了首颗羲和号太阳探测器,还多次成功将航天员送到天宫空间站。中国在航天领域的进步很快,大有赶超美国的态势。从发展趋势来看,载人登月已经宇宙为何偏爱圆球形,压扁的星球它不香吗?在北欧神话中,天空某处有一个扁平的仙境,那里有高大的建筑,通过一座彩虹桥与人类世界相连,居住在那里的都是高大的神,其中就有雷神托尔,那个地方被称为阿斯加德。而在漫威的电影中,雷神托浅析苏美尔文明2,阿努纳奇和伊吉吉苏美尔文明是早于四大文明古国的人类历史上的第一个先进文明。他们使用基于月球周期的日历系统。他们发明了测量时间和几何形状的计数系统。还发明了车轮灌溉系统帆船。他们甚至创造了第一种已知