如果直接从内存中读取挥发性字段,则在哪里读取非易失性字段



i最近正在阅读挥发性字段,因为

当我们使用带有变量的挥发性关键字时,所有线程都会读取 它的值直接从内存中,不要缓存

因此,对于非易失性字段,我想知道线程将在哪里读取其值?我以为一切都存储在内存中。

您引用的语句是误解。我推荐以下文章:https://software.rajivprab.com/2018/04/29/myths-programmers-believe-believe-about-cpu-caches/

如果每次都从主内存中真正写出/读取挥发性变量,它们的速度会很慢 - 主机参考文献比L1缓存参考慢200倍。实际上,挥发性阅读(在Java中(通常可以像L1高速缓存参考一样便宜,这使挥发力读/写入主内存的概念息息相关。如果您由于表现问题而避免使用挥发物,那么您可能是上述误解的受害者。

每个线程都有主内存的缓存。

可能会声明一个字段,在这种情况下,Java内存模型 确保所有线程都看到变量的一致值

例如,我们有这个不是线程安全的静态计数器

static int counter = 0;

如果两个线程读取并编写此变量,则会像这样

Main memory  - > static int counter 
T1-> Cache of the Main Memory. Reads/Writes directly from Cache
T2-> Cache of the Main Memory. Reads/Writes directly from Cache 

因此,在阅读和写作时会不一致。

静态挥发性int计数器= 0;

Main Memory - > static int counter;
T1 - > Read and Writes directly from the memory
T2 - > Read and Writes directly from the memory

我希望我对此提供简单的摘要。因为您需要查看有关变量并发的并发访问的更多信息在Java Docs

中检查更多

处理器上的核心/线程可以使用非volatile变量的副本,并将其放在其自己的缓存中(不是主内存(。此缓存值已更新,但是主机版本直到线程认为该刷新值后才进行。

在事件中,另一个核心/线程试图从主内存访问该值,它可能在不知不觉中找到一个过日期值。

挥发性修改器表示,每次更改时,可变数据都保持最新状态,因此,当另一个线程需要访问/编辑时,请始终准备好。

最新更新