【发布时间】:2021-05-30 08:12:09
【问题描述】:
据我了解,当从缓存回写到主存时,它会写入整个缓存块。这可能包括未修改的字节/字,因为脏位是在整个缓存块上设置的。
在此,我假设 CPU 架构通常不会在字节级别上跟踪“脏度”。如果所有当前架构确实在字节级别上进行跟踪,请随时纠正我的假设。
比如说,两个 java 字段,比如 a 和 b 并排存在并且具有相同的标签。因此,在缓存时,它们将被放置在同一个缓存块中。
假设有一个线程在内核中运行,它只更新a 的值,但不更新b。那么,a 和 b 的值实际上会从缓存中更新到主内存中吗?
或者java有什么东西可以确保只有a的值被更新,因为只有a被改变了?
java 在这里也有作用吗?还是全部依赖于 CPU 架构?
我最关心的问题
假设最初,a=1,b=1
假设我们有两个线程 T1 和 T2。 T1 只做一件事,它设置a=2。类似地,T2 执行b=2。
假设我们有一个多核环境,其中核心 C1 和 C2 分别运行 T1 和 T2。两者都缓存值a=1, b=1。
说 T1 先完成。 C1的缓存被写回。
所以,现在,在主内存中,a=2, b=1。
现在,T2 结束。现在当缓存被写回时,它是否设置了a=1, b=2,因为C2在它的缓存中有a=1?
或者Java对此有任何保证吗?
假设没有建立之前/之后发生的关系。没有同步或易失性或任何其他类似的东西。
请随时纠正我的任何假设。
【问题讨论】:
标签: java caching cpu cpu-cache