- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!