【发布时间】:2012-12-01 20:54:14
【问题描述】:
在 Java 中实现惰性供应商的正确范例或实用程序类(似乎找不到预先存在的类)是什么?
我想要一些东西来处理计算一次/缓存后的行为,并允许我独立指定计算行为。我知道这可能有一个错误,但它具有正确的语义:
abstract public class LazySupplier<T> implements Supplier<T>
{
private volatile T t;
final private Object lock = new Object();
final public T get() {
if (t == null)
{
synchronized(lock)
{
if (t == null)
t = compute();
}
}
return t;
}
abstract protected T compute();
}
【问题讨论】:
-
这对我来说很好,你在烦恼什么?
-
我知道并发不是你搞砸的东西,除非你真的采取了正确的步骤来确保它是正确的。
-
此处显示的示例代码是双重 ckecked 锁定,如cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 中所述,是一种不好的做法
-
@CarloPellegrini:在 volatile 字段之前情况很糟糕。现在没问题,只要你正确实现(使用
volatile)。 -
@ColinD 注意。在 JDK 5 和新的内存模型 (JSR 133) 之前它很糟糕。不幸的是,在工作中我被 JDK 1.4 困住了。太糟糕了...
标签: java guava lazy-evaluation