gpt4 book ai didi

java - 我们能否以类似于静态单例的方式轻松地延迟加载 Java 成员?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:12 25 4
gpt4 key购买 nike

在 Java 中对静态单例进行惰性初始化时,您可以这样做:

public class Bob {

private static class SingletonWrapper {
private static final Bob instance = new Bob();
}

public static Bob getInstance() {
return SingletonWrapper.instance;
}

}

因为内部类 SingletonWrapper 仅在第一次访问时加载 Bob() 直到 getInstance() 被调用。

我的问题是是否有任何类似的技巧可用于在非静态上下文中对成员变量进行惰性实例化。

public class Bob {

// Clearly this doesn't work as not lazy
private final InnerWrapper wrapper = new InnerWrapper();

private class InnerWrapper {
private final Jane jane = new Jane();
}

public Jane getJane() {
return wrapper.jane;
}

}

有什么方法可以让 Bob 中有一个 Jane 的实例,并且线程安全地只在需要时创建实例,而不使用双重检查锁定或 AtomicReference 。理想情况下,get 方法应保持与这些示例中的方法一样简单,但如果这不可能,那么最简单和最快(最有效)的 get 方法执行将是理想的。

最佳答案

不,没有像初始化类那样的实例化类型同步规则。你必须自己添加它们。是否使用双重检查锁定或其他一些机制来执行此操作取决于您。

从 Java 8 开始,我喜欢使用 ConcurrentHashMap#computeIfAbsent实现懒惰。

class Bob {
private final ConcurrentHashMap<String, Jane> instance = new ConcurrentHashMap<>(1);

public Jane getJane() {
return instance.computeIfAbsent("KEY", k -> new Jane()); // use whatever constant key
}
}

还有these solutions用于在没有线程安全约束的情况下进行延迟初始化。我无法将它们完全适应多线程上下文。

如评论中所述,双重检查锁定将始终比这些解决方案更快,因为它们不包括用于隐藏实现的所有绒毛。

关于java - 我们能否以类似于静态单例的方式轻松地延迟加载 Java 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33677112/

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