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

时间:2016-06-27 14:29:18

标签: java multithreading synchronized volatile

我非常了解synchronization内部人员和volatile内部人员的基本知识。

我有一个查询,这是对以下SE问题的跟进:

Why is volatile used in this example of double checked locking

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

如果synchronization不能保证内存一致性,那么使用volatile变量与synchronization代码组合的用例是什么?

2 个答案:

答案 0 :(得分:1)

该问题/答案volatilesynchronized的组合仅适用于双重检查锁定

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

在任何情况下,这并不意味着双重检查锁定是一个好主意。虽然volatile + synchronized构造将进行双重检查锁定工作,但它不会提供任何显着的性能优势,因为您还可以阅读@ alf对您所引用问题的回答。

答案 1 :(得分:1)

当定义变量volatile时,它将从主存储器而不是注册表中读取。

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

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

如果变量不是volatile,代码将起作用,但是如果你有更多的处理器,你可以在synchronized块内部进行超过需要(当变量不为空时)。< / p>

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