为临界区设置互斥锁表明不止一个线程无法破坏临界区,但为什么我们需要 volatile 变量来做同样的事情?
如果下面的代码中没有volatile字会怎样?
最佳答案
volatile 关键字使双重检查锁定在 1.5 及更高版本的 JVM 上正常工作,请参阅 Under the new Java Memory Model该页面的一部分。
如果没有 volatile 关键字,则可能会在 1.5 及更高版本的 JVM 上创建两个实例。在 1.5 之前的 JVM 上,双重检查锁定被认为是完全错误的,不应使用。
然而,在初始化单例的情况下,使用双重检查锁定通常被认为是不值得的,简单的静态初始化就足够了。如果您绝对知道您的应用程序会在某个时候初始化单例,那么惰性实例化就是多余的。只是去:
private static Singleton s_instance = new Singleton()
或任何 C++ 等价物。又好又安全!
由于这个问题最终导致了 Java 和 C++ 的困惑,请注意,我指的是上面的 Java。 C++中没有synchronized关键字,volatile不适用于并发。
关于c++ - 我们是否需要将 volatile 关键字和互斥锁一起用于线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10480153/