gpt4 book ai didi

java - 为什么将 volatile 与同步块(synchronized block)一起使用?

转载 作者:IT老高 更新时间:2023-10-28 20:45:45 25 4
gpt4 key购买 nike

我在 java 中看到了一些示例,它们在代码块上进行同步以更改某些变量,而该变量最初被声明为 volatile .. 我在单例类的示例中看到,他们将唯一实例声明为 volatile,并且它们同步了初始化该实例的 block ......我的问题是为什么我们在同步它时声明它是易失的,为什么我们需要同时做这两个?是不是其中一个对另一个就足够了??

public class SomeClass {
volatile static Object uniqueInstance = null;

public static Object getInstance() {
if (uniqueInstance == null) {
synchronized (someClass.class) {
if (uniqueInstance == null) {
uniqueInstance = new SomeClass();
}
}
}
return uniqueInstance;
}
}

提前致谢。

最佳答案

如果第一次检查在同步块(synchronized block)内,则在这种情况下,同步本身就足够了(但不是,如果变量不是 volatile 的,一个线程可能看不到另一个线程执行的更改)。仅 Volatile 是不够的,因为您需要以原子方式执行多个操作。但要小心!您在这里拥有的是所谓的双重检查锁定 - 一个常见的习惯用法,不幸的是 does not work reliably .我认为自 Java 1.6 以来这已经发生了变化,但这种代码仍然可能存在风险。

编辑:当变量为 volatile 时,此代码从 JDK 5(不是我之前写的 6)开始可以正常工作,但在 JDK 1.4 或更早版本下将无法正常工作。

关于java - 为什么将 volatile 与同步块(synchronized block)一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9665483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com