gpt4 book ai didi

java - volatile 实际上是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 09:47:28 25 4
gpt4 key购买 nike

在 Java 中将变量标记为 volatile 可确保每个线程看到最后写入该变量的值,而不是某个过时的值。我想知道这是如何实现的。 JVM 是否会发出刷新 CPU 缓存或其他内容的特殊指令?

最佳答案

据我了解,它总是看起来好像缓存在写入后已被刷新,并且总是看起来好像在读取时直接从内存中进行读取。其效果是,一个线程将始终看到另一个线程的写入结果,并且(根据 Java 内存模型)永远看不到缓存的值。然而,实际的实现和 CPU 指令会因一种架构而异。

如果您在多个线程中递增变量,或者检查其值并采取一些操作,则它不能保证正确性,因为显然没有实际的同步。一般来说,只有只有线程写入变量而其他线程都在读取时,才能保证正确执行。

另请注意,64 位非 volatile 变量可以作为两个 32 位变量进行读/写,因此 32 位变量在写入时是原子的,但 64 位变量不是。一半可以先于另一半写入 - 因此读取的值既可以是旧值也可以是新值。

这是我书签中非常有用的页面:

http://www.cs.umd.edu/~pugh/java/memoryModel/

关于java - volatile 实际上是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com