这个问题在这里已经有了答案:




9年前关闭。






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/

    10-14 10:40