<分区>
Possible Duplicate:
When exactly do you use the volatile keyword in Java?
什么时候以及为什么在 java 中需要 volatile 修饰符?
我有兴趣了解 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/