gpt4 book ai didi

java - 如何在没有关键工作不稳定的情况下实现DLC?

转载 作者:行者123 更新时间:2023-12-03 12:58:13 26 4
gpt4 key购买 nike

public  class DCL {
private static DCL staticDcl;

private final DCL finalDcl;

private DCL(){
//other init operation


//the action must be last.
finalDcl = this;
}

public static DCL getDCL() {

if (staticDcl == null) {
synchronized(DCL.class) {
if (staticDcl == null) {
staticDcl = new DCL();
}
}
}
return staticDcl.finalDcl;
}
}
上面的代码能在多线程环境下无误运行吗??
我想用关键字final来实现dcl而不是volatitle。

最佳答案

您可能会遇到问题,请参阅 Why is volatile used in double checked locking?
我建议不要使用这种模式,而是使用 static holder pattern (SHP) ,这保证了您尝试重现的所有机制。有了 SHP,您甚至不必考虑 volatile因为 JVM 会直接为您处理。

public class DCL {
private DCL(){
//other init operation
}

public static DCL getDCL() {
return Holder.INSTANCE;
}

private static final class Holder {
private static final DCL INSTANCE = new DCL();
}
}
另请注意 private final DCL finalDcl;是多余的,因为您可以直接返回实例,无需创建等于 this 的新字段.
这种模式的好处是 INSTANCE仅在第一次引用时实例化,即当 getDCL() 时叫做。这是由 lazy class loading 的性质决定的.

关于java - 如何在没有关键工作不稳定的情况下实现DLC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65990662/

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