应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Java内存模型(JMM)

  在高并发的情况下,java的内存模型到底是怎么提供支持的,要说清楚这个问题我们首先要先知道一些硬件层面的的知识,因为java的内存模型都是架构在这些硬件层面上的。计算机的存储结构
  存储器的层次结构
  计算机存储结构为金字塔型存储
  这种结构主要由寄存器,缓存(cache),内存,硬盘,远程文件存储等这几部分组成。有如下两个特点:越接近金字塔顶端速度越快,容量越小,价格越贵每一种存储器设备只和它相邻的存储设备打交道
  需要注意的是L3高速缓存是主板上被所有CPU所共享的。
  之所以是金字塔型的结构主要是局部性原理。
  程序局部性原理时间局部性
  刚被访问过的存储单元很可能不久又被访问,通常体现在循环执行的指令。让最近被访问过的信息保留在靠近CPU的存储器中加快处理速度。空间局部性
  刚被访问过的存储单元的邻近单元很有可能不久会被访问,通常体现在顺序执行的指令。将刚被访问的存储单元的邻近单元调到靠近CPU的存储器加快访问。硬件层数据一致性
  硬件层数据一致性
  我们思考这样一个问题,当CPU需要主存中读取一个X数值时,最终会被CPU1和CPU2load到自己的核心中,如果CPU1修改了X的值,设置成了1,CPU2修改了X的值设置成了2,那么就产生了数据的不一致性,那么不同核中的数据要怎么保持一致性呢?也就是说我们运用了金字塔的存储模型,速度会提高。但是会有数据不一致性的问题。要解决这个问题就需要在硬件层面进行解决。方法如下:
  总线锁
  锁住总线
  当CPU1通过总线bus访问x的值时,CPU2是不允许再访问x。因为锁住的是总线,除了访问x,访问其他的数值也是不允许的。
  总线锁会锁住总线,使得其他CPU甚至不能访问内存中其他的地址,当时此种方式效率较低。
  再老的一些CPU上会采用总线锁的方式。新的CPU采用各种各样的一致性协议。
  一致性协议
  缓存一致性协议
  这里的一致性协议会有很多,包括MSI、MESI、MOSISynapse、Firefly及Draqon,intel采用的是MESI,我们这里重点介绍这种协议。
  MESI(也称伊利诺斯协议)是一种广泛使用的支持写回策略的缓存一致性协议,该协议被应用在Intel奔腾系列的CPU中。
  CPU中每个缓存行使用的4种状态进行标记(使用额外的两位bit表示)
  状态
  描述
  M(Modified)修改
  这行数据有效,数据被修改了,和内存中的数据不一样,数据只存在于本cache中。
  E(Exclusive)独享互斥
  这行数据有效,数据和内存中的数据一致,数据只存下于本Cache中
  S(Shared)共享
  这行数据有效,数据和内存中的数据一致,数据存在于很多cache中
  I(Invalid)无效
  这行数据无效
  E状态
  E状态
  只有Core0访问变量x,它的Cacheline状态为E(Exclusive)。
  S状态
  S状态
  3个Core都访问变量x,它们对应的Cacheline为S(Shared)状态。
  M状态和状态之间的转化
  M状态和状态之间的转化
  Core0修改了x的值之后,这个Cacheline变成了M(Modified)状态,其他Core对应的Cacheline变成了I(Invalid)状态。
  在MESI协议中,每个Cache的Cache控制器不仅知道自己的读写操作,而且也监听其它Cache的读写操作。每个Cacheline所处的状态根据本核和其它核的读写操作在4个状态间进行迁移。
  需要注意的是MESI并没有完全解决锁总线的问题,我们说MESI是缓存锁,范围比起总线锁会小很多。但是有一些无法被缓存的数据或者跨越多个缓存行的数据还是需要总线锁。
  现代CPU底层的数据一致性实现是采用总线锁加缓存锁来实现的。
  缓存行
  当CPU访问某个数据时,会假设该数据附近的数据以后会被访问到,因此,第一次访问这一块区域时,会将该数据连同附近区域的数据(共64字节)一起读取进缓存中,那么这一块数据称为一个CacheLine缓存行。在一般的x86环境下一个CacheLine是64字节。
  伪共享
  缓存系统中是以缓存行(cacheline)为单位存储的,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。
  伪共享
  例如,CPU1在读取数据X时,会把相邻的Y也会加载到其缓存行中,此时如果CPU2需要读取数值Y,也会把相邻的X也加载缓存行中,此时如果CPU1修改数值X时根据缓存一致性协议会导致CPU2中的缓存行失效进而重读,如果CPU2修改数值Y时也会导致CPU1中的缓存行失效重读,这样就导致了CPU间彼此影响导致性能损耗。
  一般我们通过缓存行对齐就可以解决这样的问题。
  缓存行对齐
  基于以上问题的分析,在一些情况下,比如会频繁进行操作的数据,可以根据缓存行的特性进行缓存行对齐(即将要操作的数据凑一个缓存行进行操作)下面使用一个示例进行说明:packagecom。example。demo;publicclassCachelinenopadding{publicstaticclassT{8字节privatevolatilelongx0L;}privatestaticT〔〕arrnewT〔2〕;static{arr〔0〕newT();arr〔1〕newT();}publicstaticvoidmain(String〔〕args)throwsInterruptedException{Threadthread1newThread((){for(longi0;i10000000L;i){volatile的缓存一致性协议MESI或者锁总线,会消耗时间arr〔0〕。xi;}});Threadthread2newThread((){for(longi0;i10000000L;i){arr〔1〕。xi;}});longstartTimeSystem。nanoTime();thread1。start();thread2。start();thread1。join();thread2。join();System。out。println(总计消耗时间:(System。nanoTime()startTime)100000);}}
  总计消耗时间:2508
  下面来做一个改造升级,对齐缓存行,重点代码如下privatestaticclassPadding{78字节publicvolatilelongp1,p2,p3,p4,p5,p6,p7;}publicstaticclassTextendsPadding{8字节privatevolatilelongx0L;}
  通过上述代码做缓存对齐,每次都会有初始的78个占位,加上最后一个就是独立的一块缓存行,整理后代码如下:packagecom。example。demo;publicclassCachelinepadding{privatestaticclassPadding{78字节publicvolatilelongp1,p2,p3,p4,p5,p6,p7;}publicstaticclassTextendsPadding{8字节privatevolatilelongx0L;}privatestaticT〔〕arrnewT〔2〕;static{arr〔0〕newT();arr〔1〕newT();}publicstaticvoidmain(String〔〕args)throwsInterruptedException{Threadthread1newThread((){for(longi0;i10000000L;i){volatile的缓存一致性协议MESI或者锁总线,会消耗时间arr〔0〕。xi;}});Threadthread2newThread((){for(longi0;i10000000L;i){arr〔1〕。xi;}});longstartTimeSystem。nanoTime();thread1。start();thread2。start();thread1。join();thread2。join();System。out。println(总计消耗时间:(System。nanoTime()startTime)100000);}}
  总计消耗时间:729
  从上面可以看到,使用缓存对齐,相同操作情况下对齐后的时间比没对齐的时间减少一半。
  上面这种缓存行填充的方法在早期是比较流行的一种解决办法,比较有名的Disruptor框架就采用了这种解决办法提高性能,Disruptor是一个线程内通信框架,用于线程里共享数据。与LinkedBlockingQueue类似,提供了一个高速的生产者消费者模型,广泛用于批量IO读写,在硬盘读写相关的程序中应用十分广泛,Apache旗下的HBase、Hive、Storm等框架都有使用Disruptor。硬件级别保证有序
  乱序问题
  CPU为了提高指令的执行效率,比如在执行一条读指令(读取内存的一条数据)时,去执行另一条指令,前提是两条指令间没有依赖关系。
  我们来看这样的例子publicclassDisorder{privatestaticintx0,y0;privatestaticinta0,b0;publicstaticvoidmain(String〔〕args)throwsInterruptedException{inti0;for(;;){i;x0;y0;a0;b0;ThreadonenewThread(newRunnable(){publicvoidrun(){a1;xb;}});ThreadothernewThread(newRunnable(){publicvoidrun(){b1;ya;}});one。start();other。start();one。join();other。join();Stringresult第i次(x,y);if(x0y0){System。err。println(result);break;}else{System。out。println(result);}}}publicstaticvoidshortWait(longinterval){longstartSystem。nanoTime();longend;do{endSystem。nanoTime();}while(startintervalend);}}
  在线程体中未发生乱序问题,那么程序输出的结果就不应该有x0,y0的结果,但是根据实际执行情况来看,会输出以下内容
  第3932682次(0,0)
  也就是说,是存在乱序问题的。
  硬件内存屏障X86sfence:在sfence指令前的写操作当必须在sfence指令后的写操作前完成lfence:在lfence指令前的读操作当必须在lfence指令后的读操作前完成mfence:在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成
  原子指令
  如x86上的lock指令是一个FullBarrier,执行时会锁住内存子系统来确保执行顺序,甚至跨多个CPU。SoftwareLocks通常使用了内存屏障或原子指令来实现变量可见性和保持程序顺序。JVM级别保证有序性
  JVM级别内存屏障
  这些都是JVM级别定义的一些规范,具体的实现都是由硬件级别的内存屏障进行保障与支持的。volatile
  volatile用来修饰成员变量(静态变量和实例变量),被修饰的变量在被修改时能够保证每个线程获取该变量的最新值,从而避免出现数据脏读的现象,也就是我们说的保证数据的可见性。volatile可以保证可见性和有序性,但是不能保证原子性。要保证原子需要synchronized和Lock。
  字节码级别
  字节码级别变化
  被volatile修饰的变量在字节码级别的accessflags中会多一个volatile字符串
  JVM级别
  JVM级别
  在JVM级别就是根据volatile的写或读操作添加了相应的内存屏障。
  StoreStore屏障:禁止上面的普通写和下面的volatile写重排序;
  StoreLoad屏障:防止上面的volatile写与下面可能有的volatile读写重排序
  LoadLoad屏障:禁止下面所有的普通读操作和上面的volatile读重排序
  LoadStore屏障:禁止下面所有的普通写操作和上面的volatile读重排序
  硬件层面
  通过相应工具查看汇编指令可以发现,在window上是通过lock指令来实现的。
  因此,volatile修饰的变量具有以下的特点:Lock前缀的指令会引起处理器缓存写回内存;一个处理器的缓存回写到内存会导致其他处理器的缓存失效;当处理器发现本地缓存失效后,就会从内存中重读该变量数据,即可以获取当前最新值。

华晨宇出道以来穿搭大盘点,看看花花的时尚感如何?华晨宇,1990年出生,2013年凭借在《快乐男声》获得年度总冠军出道。出道以来热度一直很高,吐槽他的人不少,喜欢他的人也挺多。不过,他最火的一句话估计不是他的歌词,而是……三国志曹操传游戏中一些比较隐蔽的关卡,老玩家都不一定见过最近尝试视频,加上每天带孩子什么的,就忽略了图文,大家见谅哈,下个月时间充裕后还是会写图文,这块不会放弃的。今天来说说曹操传中的话题,许多骨灰级玩家玩曹操传都有20多年了……范戴克赛中被换下球迷不奇怪,他一直都踢得很差在此前结束的一场英超比赛中,利物浦13输给了布伦特福德。本场比赛中,利物浦球员范戴克在赛中被主帅克洛普换下。社交媒体上不少球迷们也纷纷对克洛普的这一换人行为表示了支持,他们认为……南非大股东再次减持腾讯7890万股,此前曾阶段性停止减持腾讯视觉中国资料图南非大股东继续减持腾讯。据腾讯控股(0700。HK)最大股东南非Naspers子公司Prosus资产净值报表显示,截至11月23日持有腾讯控股26……个股解析中国医药歌尔股份以岭药业中农联合中国医药1、该股为国企改革,新冠药物,央企改革和医药商业概念热股,作为一家医药国际贸易业务积淀深厚的大型医药上市公司,既集聚了较丰富的医药产业基础,经营范围基本涵盖了主要……欧冠尤文图斯VS巴黎圣日尔曼提前淘汰尤文又遭伤病潮昨日欧冠小组赛最后一轮一场焦点大战利物浦主场对阵那不勒斯。上半场,两队均无建树。下半场刚开始,米尔纳受伤无法坚持比赛被换下。克瓦拉茨赫利亚任意球助攻厄斯蒂高头槌破门,但是经VA……数读中国取暖神器火爆出海哪些企业瞄准欧洲御寒商机?今年欧洲遭遇能源危机,电费、取暖费用暴涨,为减少电费支出,欧洲消费者踊跃抢购中国生产的取暖设备,话题中国取暖设备火到欧洲登上微博热搜。来自中国的取暖神器火爆出海加绒丝袜、……喝酒后,若身体出现这4个现象,或说明你不适合喝酒,建议早戒酒酒在我们的生活中很常见,朋友聚餐、工作娱乐、家宴都少不了酒,有人认为大酒有害健康,小酒愉悦心情,如果能适量饮酒,对身体有益。但实际上,喝酒会对身体产生很大的影响,所谓适度……腌腊鱼,别直接抹盐,多做2个步骤,肉质鲜嫩紧实,香味足不发臭腌腊鱼,别直接抹盐,多做2个步骤,肉质鲜嫩紧实,香味足不发臭小雪过去许多天,大雪即将来临,又到了南方人,腌制腊味的时候了。今年是真冷,南方许多地区,都预报要下雪了,最近的……中国男足国脚生活如何?豪车豪宅是标配,娇妻很抢眼世界杯正在如火如荼地进行着,虽然中国男足没有机会参加本次世界杯,但是他们的动态还是非常值得大家关注的,那么中国男足的国脚们生活怎么样呢?今天我们就来看一下。先看看曾经第一……2023届高校毕业生就业机会调研民营企业对本科生需求量最大2023届高校毕业生预计规模达1158万人。前程无忧刚刚发布的《网课一代就业机会调研》显示,民营企业对本科生需求量相对最大,多数雇主认为本科毕业就工作的性价比最高。半数受……世界杯最让人失望球队诞生!球星云集高居世界第2,但出线都难散是满天星聚是一堆翔,说的或许就是如今的比利时,一场02的大冷门,宣告了比利时黄金一代的彻底凋零,这支最容易内讧的球队,或许又内讧了。事实上,你很难想象,皇马门神库尔图瓦……
奇怪!赵露思这么漂亮,怎么在曾黎旁边就像网红了?看了赵露思和曾黎的合照,原本以为赵露思已经很漂亮了,结果照片一对比,感觉曾黎气质出众更像明星,赵露思怎么在旁边就像网红了?一个人的气质除了天生的影响,后天穿搭和造型的摆拍……融资王京东方A股上市22年,融资1022亿,拿下5个全球第一卧薪尝胆,艰苦鏖战,京东方终迎来朝霞满天的黎明。京东方自2001年1月在深交所增发A股上市以来已22年,期间通过A股市场先后直接融资1022。057亿元,这超千亿的资金主……头皮上的白色颗粒是什么?漫画告诉你,管不住手的下场会怎样头发是颜值不可或缺的加分项,一个好看的发型会提升个人形象的精致感和高级感,增加时尚潮流,衬托五官的精致,表达一个人的时尚态度和审美情趣。头发的重要性不言而喻,每个爱美的人……菜鸟驿站,怎么变成,食之无味,弃之可惜的鸡肋生意菜鸟驿站实体店招牌房租居高不下,人工成本高,收取快递量费用低且数量少,多元化经营看不到希望,等等。这就是现在菜鸟驿站的生存状态。也是让快递驿站生意成为鸡肋的表面原因。……乒乓球生胶如何挑选?哪些生胶胶皮好用?乒乓球生胶颗粒形状和高度和正胶相似,击球沉,其击球特点和线路让对手难以适应,时常充当着弧圈杀手的角色。近年来中国女乒夺冠道路上的最大威胁之一的伊藤美诚反手用的正是生胶。如果您也……过了60岁以后,若还能轻松做到这5件事,多半是长寿命60岁是人生衰老分水岭,人体真正进入衰老。但长寿者却不受年龄影响,依然身强体壮。如果你60多岁,还可以轻松做到这5件事,或许会活得更久或许你有这样的感受,与年轻时相比,自……狂飚后续张译人品被撕,张颂文开挂爆红,安欣危险了近日,关于已经大结局的《狂飙》讨论度依旧火热,而除了精彩剧情之外,戏外也同样精彩,几位演员导演和剧组的番外话题也持续火爆。大结局都结束这么久了,没想到这部剧的后续依旧没能……2023,知名分析师眼中的半导体过剩!复苏!汽车!生态!我们面临的是未来几年,半导体行业都存在不确定性。过剩和稀缺会陪伴很长一段时间。到2032年的下一个十年,通过汽车、5G、IoT和基础设施的发展,半导体行业的全球产值会来到……美国27岁中锋正式入籍日本,成为日本男篮第七位归化球员原美国职业篮球运动员一一乔西霍金森JoshHawkinson正式获得日本国籍,成为日本男篮第七位归化球员。生日:1995年6月23日身高:208cm体重:10……霸气中国美女买70万平无人岛引日本人争议声称入侵冲绳第一步今年1月底,一中国女子在社交平台发布关于她几年前以公司名义在日本购买了一处无人岛,在中国引起热议,中国网友大多认为可以开发为旅游圣地,自己当岛主。这件事情报道后,也在日本的社交……别人家的孩子都在用这6个手机软件,简直相见恨晚平时周末在家,听到长辈说出最多的一句话,就是别人家的孩子有多优秀了,这极度让我怀疑自己不是亲生的。别人家的孩子经常用哪几款软件来提升自己呢,你们不好奇,不想知道吗?今天我……想生生不了?辅助生殖将逐步纳入医保,做试管婴儿费用可报销天南地北大拜年随着国内生育率的再次突破最低值,相关部门再次把提高生育率提上了日程,前段时间生娃给钱的热度还没有完全散去,最近几天,关于把辅助生殖纳入医保的消息又再次上了热……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网