單例模式詳解

2021-09-28 11:40:43 字數 1622 閱讀 8565

單例模式的應用場景餓漢式單例

先來看單例模式的類結構圖:

還有另外一種寫法,利用靜態**塊的機制:

//餓漢式靜態塊單例

public class hungrystaticsingleton

private hungrystaticsingleton(){}

public static hungrystaticsingleton getinstance()

//靜態塊,公共記憶體區域

private static lazy******singleton lazy = null;

public static lazy******singleton getinstance()

return lazy;}}

寫乙個執行緒類exectorthread 類:

public class exectorthread implements runnable}

客戶端測試**:

public class lazy******singletontest }

執行結果:

當第乙個執行緒呼叫getinstance()方法時,第二個執行緒也可以呼叫getinstance()。當第一

個執行緒執行到synchronized 時會上鎖,第二個執行緒就會變成monitor 狀態,出現阻

塞。此時,阻塞並不是基於整個lazy******singleton 類的阻塞,而是在getinstance()

方法內部阻塞,只要邏輯不是太複雜,對於呼叫者而言感知不到。

但是,用到synchronized 關鍵字,總歸是要上鎖,對程式效能還是存在一定影響的。難

道就真的沒有更好的方案嗎?當然是有的。我們可以從類初始化角度來考慮,看下面的

**,採用靜態內部類的方式:

//這種形式兼顧餓漢式的記憶體浪費,也兼顧synchronized 效能問題

//完美地遮蔽了這兩個缺點

public class lazyinnerclasssingleton

//每乙個關鍵字都不是多餘的

//static 是為了使單例的空間共享

//保證這個方法不會被重寫,過載

public static final lazyinnerclasssingleton getinstance()

//預設不載入

private static class lazyholder

}這種形式兼顧餓漢式的記憶體浪費,也兼顧synchronized 效能問題。內部類一定是要在方

法呼叫之前初始化,巧妙地避免了執行緒安全問題。

最後反射和序列化都會破壞執行緒,關於這一部分原理以及避免方法我會另外再寫一篇文章介紹

單例模式詳解

單例模式的意思就是只有乙個例項。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。1.單例模式的要點 顯然單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。2.單例模式的優點 1.例項控制 si...

單例模式詳解

單例模式是設計模式中比較常用的,今天我要詳細的了解一下,並且進行一些比較 public class singleton public static singleton getinstance catch interruptedexception e 單例模式的精髓就在這,類的內部可以new inst...

單例模式 詳解

保證乙個類僅有乙個例項,並且提供乙個訪問它的全域性訪問點 在該例項不存在的情況下,可以通過乙個方法建立乙個類來實現建立類的新例項 如果例項已經存在,它會簡單返回該物件的引用 建立型模式 var singleton function return var singlea singleton.getin...