2012-12-01 77 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

難怪我找不到課,這是一種靜態的方法 - 謝謝! –