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