我们是否需要volatile关键字和互斥锁一起用于线程安全?

时间:2012-05-07 10:03:01

标签: c++ multithreading thread-safety volatile

对于关键部分使用互斥锁会说多个线程无法破坏关键部分,但为什么我们需要 volatile 变量用于相同的部分呢?

如果以下代码中没有易失性字,会发生什么?

enter image description here

2 个答案:

答案 0 :(得分:3)

volatile关键字未提供任何锁定。

其目的是防止编译器优化“缓存”该值,以便线程可能检查过时的数据。

易失性在语言之间略有不同,总是有点问题。仔细阅读您的规格并遵循可信的示例。

答案 1 :(得分:3)

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不适用于并发。