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

深入理解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) **。

天津游瓷房子易主了吗?瓷房子还是张姓主人吗?16年5月拍的瓷房子,那时就被密密麻麻的瓷片晃到了眼睛,不晓得怎么去审视这些。天气很热,进到房子里,还是觉得凉爽。这个法式老洋房的改造,我说不上是什么印象,既刁顺亮丨游雾漫小东江游雾漫小东江刁顺亮广西贺州湖南郴州8天之旅已接近尾声了。导游再三关嘱说明天早上去小东江,必须要赶在雾散之前到达,大家不要迟到,4点起床,4点20分发车,因为路上要1个小时。小东江座茅台集团入驻房地产万达慌了,遵义的农民工明年想外出务工不要慌文蒂泱编辑泱泱审编八方天建筑工程的春天又一大企业入驻房地产行业。茅台进军遵义房地产行业遵义这个历史名城,这个红色之城文明之城茅台酒之乡,这么多荣誉集于一身的城市却没有几栋地标建筑,京东方本轮周期的低点在哪?头条创作挑战赛我是独立中年人,点击右上方关注,为你分享投资见解与收益记录参考。京东方的上一轮V型月线买卖过京东方A的股友们,都会熟知液晶周期这个概念,因为它几乎与京东方的股价周期相新车售价17。98万起,最高续航630公里,合创A06正式上市文懂车帝原创张凯懂车帝原创产品12月3日,懂车帝从合创汽车官方获悉,合创A06正式上市。合创A06定位为纯电动中型轿车,提供前驱550A前驱630C以及四驱Performance版11月安卓手机性价比榜出炉性价比手机也分三六九等,你怎么选?不可否热,尽管现在的新机在配置参数方面进行了疯狂的堆料,但是对消费者来说,还是会觉得低价策略更有吸引力,甚至可以说有些高端旗舰机看似非常激进,但实际销量还不如性价比产品高。只不过想双12值得购买的8款手机,不为其他,就为性价比双十二即将到来,很多朋友希望这一天能够换一部手机用,但是又开始纠结换哪一部,小编这里通过对比,给大家推荐了8款手机。第一款荣耀Magic4这款手机的拍照性能可谓是天花板级别,后置长榜单最新手机性价比排行5个价位段榜首你认可吗?近日,安兔兔发布了一份2022年11月份的Android手机性价比排行榜,5个价位段,来看看上榜机型有没有你在用的。(注安兔兔性价比排行计算标准一般来说都是安兔兔综合跑分除以京东售一个人高度自律的四种迹象01。告别无效社交生活中有不少人,为了合群,为了存在感,就刻意讨好四处攀附,以致忘了自己的路。缘聚缘散,人来人往,都是常态,并不是所有的人,都要去深交的。成年人自律的第一个迹象,就堵别人的路就是断自己的路有些人很善于挡在别人的前边。怕的是别人胜过自己。实际上,这种行为就叫卑鄙。再说,别人要是想前进,你挡又能挡得住吗?不是螳臂挡车,早就成了笑话。自己做好了,还用去挡别人吗?为什么不想明治毒妇刽子手连砍两刀都没死,第三刀时她大喊爱人之名爱美之心人皆有之且自古有之,古今中外的历史上留下了许多美人的姓名,后人还用笔为她们编写了一段又一段的绮丽幻梦。但那些名流史书的美人,却往往会被冠上红颜祸水的称号,当成是导致一个国家
这是游客还是难民呀?年年有人后悔,年年还是会去,前赴后继这是游客还是难民呀???看着一群游客在老君山上冒着大雪冻的哆哩哆嗦地大口吃着泡面,我还以为这是哪里的难民呢。这两位大哥吃的是真香呀,看看这头上的雪,费了九牛二虎的力气爬上了山,腿困中国年宁德味丨城隍庙米龟沾福气民俗贺新春1月29日,大年正月初八一早,一场别具特色的米龟祈福民俗活动在宁德城隍庙里举行,吸引了不少市民游人前来祈愿。摸到头,起大楼摸到嘴,大富贵摸到尾,有头又有尾伴随着悠扬的乐声和喜庆的锣爆仓的云南,旅游革命可以休矣这个春节云南究竟来了几亿人,从昆明海埂大坝上五十人喂一只海鸥,到景洪街头涨到两千元一晚依然没有房间的如家,再到芒市把签签穿出火星的烧烤摊,连澜沧凤庆元江这些非传统旅游目的地都爆仓了盘点10种在3月盛开的花,春已暖,花欲开,你知道都有哪些吗?春天来了,万物复苏了,又到了鲜花盛开的季节了,很多朋友只知道春天花会开,但是大家知道三月份都是什么花会开吗?今天我就给大家盘点一下10种在3月份开的花,看看有没有大家喜欢的,感兴趣和我国相隔万里的高山小国,为什么张灯结彩为我们过兔年?瑞士的兔年大吉!随着中国农历新年的到来,远在欧洲的高山小国瑞士少女峰装点一新。缆车起始站早早就布置起了兔年装饰和红灯笼,冰雕区内,一只晶莹剔透的兔子前方用中文书写着兔年大吉。少女峰平遥古城游记平遥古城游记平遥古城,位于山西省晋中市平遥县,始建于周宣王时期,明洪武三年(1370年)扩建,距今已有2800多年的历史。平遥,和祁县及太古并称晋商三大故里,实为古时我国北部经济重水稻就是风景线,梯田就是金饭碗一线讲述水稻就是风景线,梯田就是金饭碗讲述人广西龙胜县龙脊镇大寨村党支部原书记潘保玉自从我们大寨村入选2022年世界最佳旅游乡村后,我的电话就响个不停,有游客来电祝贺,也有不少人取围炉享大餐长城观日出山间泡温泉,古北水镇里到处有年味无论初一暖阳初二大风,还是初三寒潮初六回暖,整个春节假期,长城脚下获评北京首批旅游度假区称号的北京密云古北水镇(司马台长城)国际旅游度假区,迎来了众多京内外游客。景区旗下酒店入住率(86)尧舜禹被孔子高度评价,他们究竟是怎样的人?今天呢,我们来讲尧舜禹的故事。先讲尧尧舜禹尧,是传说中父系氏族社会后期的部落联盟首领,原名祁放勋,后封于唐,故称陶唐氏。他代替帝挚为天子,定都平阳。在万国争雄的时代,团结周围部族,接受CT检查的阿蒙霍特普一世法老埃及,开罗原作者JARRETTA。LOBELL2023年1月2月本人仅仅增加一点内容和加以编辑整理2021年12月,埃及旅游和文物部28日说,该国研究人员运用CT扫描等技术首次以数扑朔迷离的谋杀案到底是谁杀死了塔中王子?在过去的一个半世纪里,托马斯莫尔爵士对塔中王子谋杀案的描述受到了不同程度的怀疑。尽管如此,莫尔的理查三世国王史还是值得注意的,因为它为1483年继承危机的焦点提供了精确的间接细节和