java - 什么时候使用 Volatile 修饰符?

标签 java volatile

<分区>

Possible Duplicate:
When exactly do you use the volatile keyword in Java?

什么时候以及为什么在 java 中需要 volatile 修饰符?

我有兴趣了解 volatile 修饰基元或对象引用在现实世界中的使用情况。

最佳答案

volatile 修饰符会告诉 JVM 小心并发运行的线程。本质上,volatile 用于指示变量的值将被不同的线程修改。

声明一个 volatile Java 变量意味着:

  • 这个变量的值永远不会在线程本地缓存:所有读写都会直接进入“主内存”

  • 对变量的访问就好像它包含在同步块(synchronized block)中一样,在自身上同步。

我们在第二点中说“好像”,因为至少对于程序员(并且可能在大多数 JVM 实现中)没有涉及实际的锁对象。


volatile 修饰符告诉编译器,由 volatile 修饰的变量可能会被程序的其他部分意外更改。其中一种情况涉及多线程程序。

在多线程程序中,有时,两个或多个线程共享同一个实例变量。出于效率考虑,每个线程都可以保留自己的此类共享变量的私有(private)副本。

变量的真实(或主)副本会在不同时间更新,例如当输入同步方法时。虽然这种方法工作正常,但有时可能效率低下。在某些情况下,真正重要的是变量的主副本始终反射(reflect)其当前状态。

为确保这一点,只需将变量指定为 volatile,这告诉编译器它必须始终使用 volatile 变量的主副本(或者,至少,始终使任何私有(private)副本与主副本保持同步,并且反之亦然)。此外,对主变量的访问必须按照它们在任何私有(private)副本上执行的精确顺序执行。

关于java - 什么时候使用 Volatile 修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10393728/

相关文章:

java - 用于在 Java 中的 Google Apps 引擎中更新照片的 ByteString 值无效

java - Micrometer @Timed 注解

java - 如果我省略 Java 的 volatile 关键字会发生什么?

java - 如果在构造函数中分配一次,原始变量是否需要是 volatile 的

java - Java 单例类中的 Volatile 字段

java - 相当于 Python 中的 Java volatile

java - 如何使用 Hibernate 进行大量插入?

java - 使用扫描仪阅读/查找特定部分

java - Exoplayer 构建器在按下后退并再次打开视频时出现错误

java - 当字段的值取决于其先前值时,为什么 Volatile 不起作用