首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >延迟加载的单例:双重检查锁定与按需初始化保持习语

延迟加载的单例:双重检查锁定与按需初始化保持习语
EN

Stack Overflow用户
提问于 2011-05-31 14:28:28
回答 5查看 6.3K关注 0票数 9

我需要在并发环境中延迟加载资源。加载资源的代码应该只执行一次。

二次检查锁定 (使用JRE 5+和易失性关键字)和按需初始化成语似乎都很适合这项工作。

只看代码,初始化随需应变的习惯用法似乎更干净、更高效(但是,我猜这里是这样的)。尽管如此,我还是要在我的每一个单身汉注意和记录模式。至少对我来说,很难理解为什么代码是这样当场写出来的.

我在这里的问题是:哪种方法更好?为什么?如果你的回答是没有。您将如何在Java环境中处理此需求?

替代品

我可以在不将CDI应用于整个项目的情况下使用CDI吗?外面有文章吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-31 14:30:10

增加另一个,也许更干净的选项。我建议使用enum变体:

在Java中使用Enum作为单例的最佳方法是什么?

票数 7
EN

Stack Overflow用户

发布于 2011-05-31 14:36:51

就可读性而言,我将采用按需初始化的方法。我觉得这个双重检查的锁是一个过时的和丑陋的实现。

从技术上讲,通过选择双重检查锁定,您总是会在字段中发生易失性读取,因为您可以使用初始化随需应变的习惯用法进行正常读取。

票数 7
EN

Stack Overflow用户

发布于 2011-05-31 23:40:09

初始化-按需配置仅适用于单个实例,不能让每个实例延迟加载元素。双重检查锁定给每个必须看课程的人增加了认知负担,因为在微妙的情况下很容易出错。在我们将模式封装到我们的并发库中的实用程序类之前,我们常常会遇到各种各样的问题。

我们有以下选择:

代码语言:javascript
运行
复制
Supplier<ExpensiveThing> t1 = new LazyReference<ExpensiveThing>() {
  protected ExpensiveThing create() {
    … // expensive initialisation
  }
};

Supplier<ExpensiveThing> t2 = Lazy.supplier(new Supplier<ExpensiveThing>() {
  public ExpensiveThing get() {
    … // expensive initialisation
  }
});

就用法而言,两者都有相同的语义。第二份表格提供内部供应商在初始化后使用的任何参考资料。第二种形式还支持TTL/TTI策略的超时。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6189099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档