java内存栅栏,Java内存屏障(MemoryBarriers)

更新时间:2023-06-11 02:06:43 阅读: 评论:0

java内存栅栏,Java内存屏障(MemoryBarriers)
内存屏障(Memory Barrier,或有时叫做内存栅栏,Memory Fence)是⼀种CPU指令,⽤于控制特定条件下的重排序和内存可见性问题。Java编译器也会根据内存屏障的规则禁⽌重排序。
1.java内存屏障
java 的内存屏障通常所谓的四种即LoadLoad、StoreStore、LoadStore、StoreLoad 。
LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。
StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写⼊操作执⾏前,保证Store1的写⼊操作对其它处理器可见。
限速5公里
LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写⼊操作被刷出前,保证Load1要读取的数据被读取完毕。
StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执⾏前,保证Store1的写⼊对所有处理器可见。它的开销是四种屏障中最⼤的。        在⼤多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。
激素的分类
有的处理器的重排序规则较严,⽆需内存屏障也能很好的⼯作,Java编译器会在这种情况下不放置内存屏障。
2.volatile语义中的内存屏障
社会经历
volatile的内存屏障策略⾮常严格保守,⾮常悲观且毫⽆安全感的⼼态:
在每个volatile写操作前插⼊StoreStore屏障,在写操作后插⼊StoreLoad屏障;
皮试结果如何判断在每个volatile读操作前插⼊LoadLoad屏障,在读操作后插⼊LoadStore屏障;
由于内存屏障的作⽤,避免了volatile变量和其它指令重排序、线程之间实现了通信,使得volatile表现出了锁的特性。
ie代理
3.final语义中的内存屏障
对于final域,编译器和CPU会遵循两个排序规则:油炸鱼块怎么做好吃
(1).新建对象过程中,构造体中对final域的初始化写⼊和这个对象赋值给其他引⽤变量,这两个操作不能重排序;(废话嘛)
短效避孕药危害
(2).初次读包含final域的对象引⽤和读取这个final域,这两个操作不能重排序;(晦涩,意思就是先赋值引⽤,再调⽤final值)
也就是说必需保证⼀个对象的所有final域被写⼊完毕后才能引⽤和读取。这也是内存屏障的起的作⽤。
写final域:在编译器写final域完毕,构造体结束之前,会插⼊⼀个StoreStore屏障,保证前⾯的对final写⼊对其他线程/CPU可见,并阻⽌重排序。新生儿疫苗接种
读final域:在上述规则2中,两步操作不能重排序的机理就是在读final域前插⼊了LoadLoad屏障。

本文发布于:2023-06-11 02:06:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/925856.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   屏障   读取
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图