2012-11-19 57 views

回答

4

不,它不是固定的,不會被固定。 Java 5剛剛明確指出,這個習語被打破了,這是最終的裁決。懶洋洋地初始化實例字段的正確方法涉及到另一個,同樣叫成語:在仔細檢查成語

// Double-check idiom for lazy initialization of instance fields. 
private volatile FieldType field; 
FieldType getField() { 
    FieldType result = field; 
    if (result == null) { // First check (no locking) 
    synchronized(this) { 
     result = field; 
     if (result == null) // Second check (with locking) 
     field = result = computeFieldValue(); 
    } 
    } 
    return result; 
} 

參考:喬希布洛赫,有效的Java。另見this Oracle technetwork interview with Josh Bloch

8

一個簡單的谷歌出現在該

  • 如果使用一種特定的方式將其固定在Java 5中(見馬爾科的答案)
  • 它仍然不是好主意。通常一個簡單的enum是更好的解決方案。

而是寫

public final class Singleton { 
    // Double-check idiom for lazy initialization of instance fields. 
    private static volatile Singleton instance; 

    private Singleton() { 
    } 

    public static Singleton getInstance() { 
     Singleton result = instance; 
     if (result == null) { // First check (no locking) 
      synchronized (Singleton.class) { 
       result = instance; 
       if (result == null) // Second check (with locking) 
        instance = result = new Singleton(); 
      } 
     } 
     return result; 
    } 
} 

,你可以只寫

public enum Singleton { 
    // Thread safe lazy initialization of instance field. 
    INSTANCE 
} 
相關問題