我需要在并发环境中延迟加载资源。加载资源的代码应该只执行一次。
二次检查锁定 (使用JRE 5+和易失性关键字)和按需初始化成语似乎都很适合这项工作。
只看代码,初始化随需应变的习惯用法似乎更干净、更高效(但是,我猜这里是这样的)。尽管如此,我还是要在我的每一个单身汉注意和记录模式。至少对我来说,很难理解为什么代码是这样当场写出来的.
我在这里的问题是:哪种方法更好?为什么?如果你的回答是没有。您将如何在Java环境中处理此需求?
替代品
我可以在不将CDI应用于整个项目的情况下使用CDI吗?外面有文章吗?
发布于 2011-05-31 14:30:10
增加另一个,也许更干净的选项。我建议使用enum变体:
发布于 2011-05-31 14:36:51
就可读性而言,我将采用按需初始化的方法。我觉得这个双重检查的锁是一个过时的和丑陋的实现。
从技术上讲,通过选择双重检查锁定,您总是会在字段中发生易失性读取,因为您可以使用初始化随需应变的习惯用法进行正常读取。
发布于 2011-05-31 23:40:09
初始化-按需配置仅适用于单个实例,不能让每个实例延迟加载元素。双重检查锁定给每个必须看课程的人增加了认知负担,因为在微妙的情况下很容易出错。在我们将模式封装到我们的并发库中的实用程序类之前,我们常常会遇到各种各样的问题。
我们有以下选择:
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策略的超时。
https://stackoverflow.com/questions/6189099
复制相似问题