首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java是否只更改缓存中已修改字段的值?

Java是否只更改缓存中已修改字段的值?
EN

Stack Overflow用户
提问于 2021-03-01 00:36:31
回答 1查看 50关注 0票数 2

根据我的理解,当从缓存回写到主存时,它将写入整个缓存块。这可能还包括未修改的字节/字,因为脏位是作为整体在缓存块上设置的。

在这一点上,我假设CPU架构通常不会跟踪字节级的“脏”。如果出现以下情况,请随时更正我的假设

全部

目前的体系结构确实在字节级上跟踪。

比方说,两个java字段,比方说

并排驻留,并具有相同的标签。因此,在缓存时,它们将被放在相同的缓存块中。

假设有一个线程在内核中运行,它只更新

,但不是

..。那么,实际上两者的价值

在主内存中从缓存中更新?或者java有没有什么东西可以确保只有

是更新的,因为只有

是不是改变了?

java在这里有什么作用吗?还是完全依赖于CPU架构?

我最关心的是

最初假设,

假设我们有两个线程T1和T2。T1只做一件事,它设置

..。类似地,T2也是如此

..。

假设我们有一个多核环境,核心C1和C2分别运行T1和T2。两者都缓存值

..。

假设T1是第一个完成的。写回C1的缓存。所以,现在,在主存储器中,

..。现在,T2完成了。现在,当写回缓存时,它是否设置

因为C2有

在它的缓存里?

或者Java对此有什么保证吗?

假设在建立关系之前/之后没有发生。没有同步或易失性或其他类似的东西。

请随时纠正我的任何假设。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 01:07:56

吹毛求疵:理论上,写操作不需要进入主存;它们可以无限期地留在缓存中,这取决于所使用的缓存一致性算法。

您提到的问题称为单词撕裂,JVM应该对其进行保护。

查看以下链接:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.6

https://shipilev.net/blog/2014/jmm-pragmatics/#

_

零件

_

_

单词

_

撕裂

我不熟悉其他架构,但在X86上,加载和存储可以在字节级完成。N字节字段将始终是n字节对齐的;因此它永远不会被拆分到2个高速缓存线上。由于在Java语言中,布尔值存储在一个字节中,因此在X86上不会发生字撕裂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66411357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档