多线程场景下的volatile + synchronized组合

volatile + synchronized combination in multithreaded scenario

我非常了解 synchronization 内部结构和 volatile 内部结构的基础知识。

我有一个查询,是以下 SE 问题的后续:

Why is volatile used in this example of double checked locking

我对一部分感到困惑。如果我严格按照上面的示例,我必须将 volatile 添加到许多变量,但我确信所有多线程应用程序都没有使用这种 volatile + synchronized 组合。

如果 synchronization 不能保证上述示例中的内存一致性,那么使用 volatile 变量与 synchronization 代码的组合有哪些用例?

volatilesynchronized 的组合 question/answer 仅适用于 双重检查锁定.

如果您没有进行双重检查锁定,并且始终在同一个 synchronized 监视器的保护下访问您的共享变量(这是应用程序最常访问共享变量的方式,如果它们是不使用 java.util.concurrent 类),那么你不需要 volatile.

无论如何,这并不意味着双重检查锁定是个好主意。尽管 volatile + synchronized 构造将使双重检查锁定起作用,但它不会提供任何显着的性能优势,因为您还可以阅读@alf 对您所指问题的回答。

定义变量时volatile它是从主内存而不是注册表中读取的。

因此每个处理器将看到相同的值。

在仔细检查中,变量定义为 volatile 以确保在 synchronized 块之外进行检查将拦截大多数情况。

如果变量不是 volatile 代码将工作,但如果你有更多的处理器,你可以进入 synchronized 块内部超过需要(当变量不为空时) .

如果对变量的所有访问都在 synchronized 块中完成,则根本不需要 volatile