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
变量的副本,并将其放在其自己的缓存中(不是主内存(。此缓存值已更新,但是主机版本直到线程认为该刷新值后才进行。
在事件中,另一个核心/线程试图从主内存访问该值,它可能在不知不觉中找到一个过日期值。
挥发性修改器表示,每次更改时,可变数据都保持最新状态,因此,当另一个线程需要访问/编辑时,请始终准备好。