我非常了解synchronization
内部人员和volatile
内部人员的基本知识。
我有一个查询,这是对以下SE问题的跟进:
Why is volatile used in this example of double checked locking
我对一部分感到困惑。如果我严格按照上面的例子,我必须将volatile
添加到许多变量,但我确信所有多线程应用程序都没有使用此volatile + synchronized组合。
如果synchronization
不能保证内存一致性,那么使用volatile
变量与synchronization
代码组合的用例是什么?
答案 0 :(得分:1)
该问题/答案中volatile
和synchronized
的组合仅适用于双重检查锁定。
如果您没有进行双重检查锁定,并且始终在同一synchronized
监视器的保护范围内访问您的共享变量(这是应用程序最常访问共享变量的方式,如果它们不使用java.util.concurrent
类),那么您不需要volatile
。
在任何情况下,这并不意味着双重检查锁定是一个好主意。虽然volatile
+ synchronized
构造将进行双重检查锁定工作,但它不会提供任何显着的性能优势,因为您还可以阅读@ alf对您所引用问题的回答。
答案 1 :(得分:1)
当定义变量volatile
时,它将从主存储器而不是注册表中读取。
因此每个处理器都会看到相同的值。
在仔细检查中,变量定义为volatile
,以确保在synchronized
块之外检查将拦截大多数情况。
如果变量不是volatile
,代码将起作用,但是如果你有更多的处理器,你可以在synchronized
块内部进行超过需要(当变量不为空时)。< / p>
如果在synchronized
块中完成对变量的所有访问,则根本不需要volatile
。