JAVA 單例模式

2021-09-12 18:36:19 字數 2124 閱讀 4015

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。

許多時候整個系統只需要擁有乙個全域性的物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。

單例模式要求類能夠有返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法)。

單例的實現主要是通過以下兩個步驟:

將該類的構造方法定義為私有方法,這樣其他處的**就無法通過呼叫該類的構造方法來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項;

在該類內提供乙個靜態方法,當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用。

單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。

好了,讓我們來看看常見的寫法

package test;

public class singleton

public static singleton getinstance()

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

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

public class singleton 

public static synchronized singleton getinstance()

return instance;

}}

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

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

public class singleton 

public static singleton getinstance()}}

return instance;

}}

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

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

public class singleton 

public static singleton getinstance()

}

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

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

public class singleton 

private static class singletonholder

public static singleton getinstance()

}

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

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

java單例模式

第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...

Java 單例模式

單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...