單例模式實現

2021-09-13 21:22:02 字數 1705 閱讀 1761

單例模式(singleton):保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

1、適用於單執行緒

class singleton

public static singleton getinstance()

return instance;

}}

註解:singleton的靜態屬性instance中,只有instance為null的時候才建立乙個例項,建構函式私有,確保每次都只建立乙個,避免重複建立。

缺點:只在單執行緒的情況下正常執行,在多執行緒的情況下,就會出問題。例如:當兩個執行緒同時執行到判斷instance是否為空的if語句,並且instance確實沒有建立好時,那麼兩個執行緒都會建立乙個例項。

2、適用於多執行緒,懶漢式(不好)

class singleton

public static synchronized singleton getinstance()

return instance;

}}

註解:在解法一的基礎上加上了同步鎖,使得在多執行緒的情況下可以用。例如:當兩個執行緒同時想建立例項,由於在乙個時刻只有乙個執行緒能得到同步鎖,當第乙個執行緒加上鎖以後,第二個執行緒只能等待。第乙個執行緒發現例項沒有建立,建立之。第乙個執行緒釋放同步鎖,第二個執行緒才可以加上同步鎖,執行下面的**。由於第乙個執行緒已經建立了例項,所以第二個執行緒不需要建立例項。保證在多執行緒的環境下也只有乙個例項。

缺點:每次通過getinstance方法得到singleton例項的時候都有乙個試圖去獲取同步鎖的過程。而眾所周知,加鎖是很耗時的。能避免則避免。

3、加同步鎖(可行)

class singleton

public static singleton getinstance()}}

return instance;

}}

註解:只有當instance為null時,需要獲取同步鎖,建立一次例項。當例項被建立,則無需試圖加鎖。

缺點:用雙重if判斷,複雜,容易出錯。

4、餓漢式(建議使用)

class singleton

public static singleton getinstance()

}

註解:初試化靜態的instance建立一次。如果我們在singleton類裡面寫乙個靜態的方法不需要建立例項,它仍然會早早的建立一次例項。而降低記憶體的使用率。

缺點:沒有lazy loading的效果,從而降低記憶體的使用率。

5、靜態內部類(建議使用)

class singleton

private static class singletonholder

public static singleton getinstance()

}

註解:定義乙個私有的內部類,在第一次用這個巢狀類時,會建立乙個例項。而型別為singletonholder的類,只有在singleton.getinstance()中呼叫,由於私有的屬性,他人無法使用singleholder,不呼叫singleton.getinstance()就不會建立例項。

優點:達到了lazy loading的效果,即按需建立例項。

6、運用enum實現單例模式

enum singletondemo

}

單例模式實現

推薦的單例實現方法 餓漢模式 1種 public class singleton public static singleton getinstance 雙重檢查 volatile關鍵字必須加 public class singleton public static singleton getins...

單例模式實現

什麼是設計模式 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類的 設計經驗的總結 使用設計模式的目的 為了 可重用性 讓 更容易被他人理解 保證 可靠性 什麼是單例模式 單例模式是設計模式的一種,也是最簡單的一種,在單例模式中乙個類只能建立乙個例項,這種設計模式可以...

單例模式實現

單例模式分為餓漢式和懶漢式 實現 餓漢式 所謂餓漢式,也就是不管能不能用的上,都會載入,像乙個惡漢,如果在構造方法裡寫了效能消耗較大,佔時較久的 比如建立與資料庫的連線,那麼就會在啟動的時候感覺稍微有些卡頓。private singleton1 private static singleton1 i...