对于关键部分使用互斥锁会说多个线程无法破坏关键部分,但为什么我们需要 volatile 变量用于相同的部分呢?
如果以下代码中没有易失性字,会发生什么?
答案 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不适用于并发。