2012-12-01 78 views
15

在Java中实现懒惰供应商的正确范例或实用类是什么(似乎无法找到预先存在的类)?在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(); 
} 
+1

对我来说这看起来很好,什么让你烦恼? –

+1

我知道,除非您真的采取正确的步骤来确保它是正确的,否则并发不是您所惹恼的。 –

+0

这里显示的示例代码是一个双重ckecked锁定,并且是不正确的做法,如http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html –

回答

28

这在Suppliers.memoize方法已经实施。

+1

难怪我找不到课,这是一种静态的方法 - 谢谢! –