根据我的理解,当从缓存回写到主存时,它将写入整个缓存块。这可能还包括未修改的字节/字,因为脏位是作为整体在缓存块上设置的。
在这一点上,我假设CPU架构通常不会跟踪字节级的“脏”。如果出现以下情况,请随时更正我的假设
全部
目前的体系结构确实在字节级上跟踪。
比方说,两个java字段,比方说
和
并排驻留,并具有相同的标签。因此,在缓存时,它们将被放在相同的缓存块中。
假设有一个线程在内核中运行,它只更新
,但不是
..。那么,实际上两者的价值
和
在主内存中从缓存中更新?或者java有没有什么东西可以确保只有
是更新的,因为只有
是不是改变了?
java在这里有什么作用吗?还是完全依赖于CPU架构?
我最关心的是
最初假设,
假设我们有两个线程T1和T2。T1只做一件事,它设置
..。类似地,T2也是如此
..。
假设我们有一个多核环境,核心C1和C2分别运行T1和T2。两者都缓存值
..。
假设T1是第一个完成的。写回C1的缓存。所以,现在,在主存储器中,
..。现在,T2完成了。现在,当写回缓存时,它是否设置
因为C2有
在它的缓存里?
或者Java对此有什么保证吗?
假设在建立关系之前/之后没有发生。没有同步或易失性或其他类似的东西。
请随时纠正我的任何假设。
发布于 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上不会发生字撕裂。
https://stackoverflow.com/questions/66411357
复制相似问题