首页 新闻 搜索 专区 学院

多线程里的寄存器存储方式?求大神指点。

0
悬赏园豆:30 [已解决问题] 解决于 2021-01-19 01:34

在两个线程里面A B。A线程用while空语句监视B线程状态值flag,条件是flag为false. B线程的flag不是volatile的。这个时候读取不到B线程对flag的修改。。while(!B.flag){};

flag是成员属性,在堆里面,为啥被拉到寄存器中执行了。java运行时那些值被拉到寄存器存放? 我听说这块是对jvm优化后搞得?

梦再笑的主页 梦再笑 | 初学一级 | 园豆:61
提问于:2021-01-12 15:15
< >
分享
最佳答案
0

你这个问题就会涉及到多级缓存了,在计算机中,你说的堆就是主存,寄存器是对cpu来说读取最快的,其中还会有多级缓存,一级缓存,二级缓存,三级缓存,最后才是主存;速度的话是寄存器>一级缓存>二级缓存>三级缓存>主存>磁盘。
寄存器和缓存是cpu独占的,多个cpu直接可能会共用缓存,比如三级缓存,cup对数据的操作是按最小单位读取并缓存在多级缓存中,就是叫缓存行,volatile关键字就是cpu在对数据操作时会使缓存中的数据失效,强制通过公共的主存操作数据,使得数据对所有cpu是可见的;
有一种写法叫缓存行对齐,通过冗余字段的方式避免,java有@Contended注解可以了解下

收获园豆:30
95的人 | 菜鸟二级 |园豆:312 | 2021-01-12 19:17

非常感谢你。从这个问题上来理解,堆应该是在主存RAM上的。因为没有volatile的堆数据会被加载到缓存或者寄存器里操作完后刷入主存RAM中。但还有很多说堆是属于二级缓存CACHE,这个怎么理解么?请教下。

梦再笑 | 园豆:61 (初学一级) | 2021-01-15 14:05

@梦再笑: 其实不能说堆的数据属于哪儿,堆的数据可能在内存、磁盘(开启内存交换)、缓存(对内存的缓存)中。对于你的问题“但还有很多说堆是属于二级缓存CACHE”这句话我不知道是在什么场景下说的,没有上下文联系,所以也无法解答。

95的人 | 园豆:312 (菜鸟二级) | 2021-01-15 14:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册