public
class
singleton1
/**私有的構造方法**/
private
singleton1()
}
public
class
singleton2
}return instance;}}
/**私有構造方法**/
private
singleton2()
}
以上的懶漢式,為什麼要進行兩次判空呢?懶漢式單例模式涉及併發的問題。
第乙個判空,是判斷當前的例項是否為空,若不為空的話,則進入準備建立乙個新的例項,所以這時候必須用synchronized上鎖,防止其他執行緒也判斷為空進來建立例項,換言之它在準備要建立例項的時候不允許其他執行緒進來。接下來再判斷一次空,是因為上鎖之後可能其他執行緒在synchronized外面排隊,等第乙個例項建立完之後,其他執行緒進來了,如果這時候不判斷例項是否為空就建立,就可能又建立乙個例項,違背了單例模式了。
為什麼synchronized放在第乙個判空裡面而不是放在方法宣告?
請看一下**:
/**提供靜態的公共方法,獲得唯一例項**/
/**由於使用synchronized會影響效能,若放在方法宣告裡,則會每次呼叫getinstance()獲取例項的時候都上鎖,導致效能降低**/
public
static
synchronized singleton2 getinstance()
若使用兩次判空,把synchronized放到方法裡面,通過第乙個判空可減少了synchronized的執行次數。
/**提供靜態的公共方法,獲得唯一例項**/
public
static singleton2 getinstance()
}return instance;
}}
設計模式 單例模式 餓漢式,懶漢式
餓漢式 將物件的實現提前準備好,物件指向的記憶體只能有乙個。public class singlection1 餓漢式單例實現 將物件的實現提前準備好 private static final singlection1 single1 new singlection1 靜態工廠 public sta...
設計模式 單例模式之餓漢式和懶漢式
設計模式 通過大量的實踐和總結出來的優化的 結構,程式設計風格,以及解決問題的方式。單例設計模式 乙個類只能建立乙個例項。如何實現呢?以下4步。1 私有化構造器,為了是只能在類內部建立例項,而不能在類外建立例項。2 在類內部建立例項,私有化此例項。3 公有的方法呼叫此例項,通過類呼叫,因此設定為st...
設計模式 單例模式之餓漢式和懶漢式
單例模式可以分為懶漢式和餓漢式 餓漢式是執行緒安全的,無需關注多執行緒問題,它是在類載入時建立例項 懶漢式不是執行緒安全的,建立例項的時間與餓漢式相反是延時載入 餓漢式示例 public class test private static test test null public static s...