目錄
創(chuàng)新互聯(lián)是專業(yè)的阿魯科爾沁網(wǎng)站建設(shè)公司,阿魯科爾沁接單;提供成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行阿魯科爾沁網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!1.餓漢式單例模式:
2.懶漢式單例模式:
3、雙重校驗鎖式單例模式:
4、靜態(tài)內(nèi)部類式單例模式:
5、枚舉式單例模式:
6、容器式單例模式:
7、工廠方法式單例模式:
在 Java 中,常見的單例模式有以下幾種寫法:
1.餓漢式單例模式:public class Singleton {
? ? private static final Singleton INSTANCE = new Singleton();
? ? private Singleton() {}
? ? public static Singleton getInstance() {
? ? ? ? return INSTANCE;
? ? }
}
這種寫法的特點是在類加載時就創(chuàng)建了單例對象,因此又被稱為餓漢式單例模式。由于單例對象在類加載時就已經(jīng)創(chuàng)建好了,所以它是線程安全的。但是,這種寫法的缺點是如果單例類的構(gòu)造函數(shù)中存在耗時的操作,可能會導(dǎo)致類加載慢,在一些場景下不太合適。
2.懶漢式單例模式:public class Singleton {
? ? private static Singleton instance;
? ? private Singleton() {}
? ? public static synchronized Singleton getInstance() {
? ? ? ? if (instance == null) {
? ? ? ? ? ? instance = new Singleton();
? ? ? ? }
? ? ? ? return instance;
? ? }
}
這種寫法的特點是在第一次調(diào)用 getInstance() 方法時才創(chuàng)建單例對象,因此又被稱為懶漢式單例模式。由于單例對象在第一次調(diào)用 getInstance() 方法時才會被創(chuàng)建,所以在多線程環(huán)境下需要使用 synchronized 關(guān)鍵字來保證線程安全。但是,這種寫法的效率較低,因為每次調(diào)用 getInstance() 方法都需要加鎖,耗費(fèi)較多的時間
3、雙重校驗鎖式單例模式:public class Singleton {
? ? private static volatile Singleton instance;
? ? private Singleton() {}
? ? public static Singleton getInstance() {
? ? ? ? if (instance == null) {
? ? ? ? ? ? synchronized (Singleton.class) {
? ? ? ? ? ? ? ? if (instance == null) {
? ? ? ? ? ? ? ? ? ? instance = new Singleton();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return instance;
? ? }
}
這種寫法的特點是在第一次調(diào)用 getInstance() 方法時才創(chuàng)建單例對象,且使用了雙重校驗鎖的機(jī)制來保證線程安全。這種寫法的優(yōu)點是在多線程環(huán)境下可以保證單例對象的唯一性,同時又不會影響程序的效率,因為在單例對象已經(jīng)被創(chuàng)建之后,后續(xù)的調(diào)用 getInstance() 方法都不會進(jìn)行加鎖操作。
4、靜態(tài)內(nèi)部類式單例模式:public class Singleton {
? ? private static class SingletonHolder {
? ? ? ? private static final Singleton INSTANCE = new Singleton();
? ? }
? ? private Singleton() {}
? ? public static Singleton getInstance() {
? ? ? ? return SingletonHolder.INSTANCE;
? ? }
}
這種寫法的特點是使用了靜態(tài)內(nèi)部類的機(jī)制來保證單例對象的唯一性。在這種寫法中,我們定義了一個靜態(tài)內(nèi)部類 SingletonHolder,在該類中定義了一個靜態(tài)變量 INSTANCE,該變量在類加載時就會被初始化為單例對象。在外部類的 getInstance() 方法中,我們只需要返回 SingletonHolder.INSTANCE 即可。由于靜態(tài)內(nèi)部類的特性,單例對象只會在第一次調(diào)用 getInstance() 方法時被創(chuàng)建,因此這種寫法又被稱為延遲加載單例模式。這種寫法的優(yōu)點是在多線程環(huán)境下可以保證單例對象的唯一性,同時又不會影響程序的效率。
5、枚舉式單例模式:public enum Singleton {
? ? INSTANCE;
? ? public void doSomething() {
? ? ? ? // do something
? ? }
}
這種寫法的特點是使用了枚舉類型來實現(xiàn)單例模式。枚舉類型在 Java 中是一種特殊的類,它的對象數(shù)量是有限的,而且在編譯期間就已經(jīng)確定。在這種寫法中,我們只需要定義一個枚舉常量 INSTANCE 即可,在調(diào)用 Singleton.INSTANCE 時就會返回單例對象。這種寫法的優(yōu)點是簡單易寫,同時在多線程環(huán)境下也是線程安全的。
6、容器式單例模式:public class Singleton {
? ? private static MapsingletonMap = new HashMap<>();
? ? private Singleton() {}
? ? public static void registerService(String key, Object instance) {
? ? ? ? if (!singletonMap.containsKey(key)) {
? ? ? ? ? ? singletonMap.put(key, instance);
? ? ? ? }
? ? }
? ? public static Object getService(String key) {
? ? ? ? return singletonMap.get(key);
? ? }
}
這種寫法的特點是將單例對象存儲在一個容器(如 Map)中,通過 registerService 和 getService 方法來管理單例對象。這種寫法的優(yōu)點是可以管理多個單例對象,同時在多線程環(huán)境下也是線程安全的。
7、工廠方法式單例模式:public class SingletonFactory {
? ? private static Singleton instance;
? ? static {
? ? ? ? instance = new Singleton();
? ? }
? ? public static Singleton getInstance() {
? ? ? ? return instance;
? ? }
}
這種寫法的特點是將單例對象的創(chuàng)建封裝在工廠方法中,通過調(diào)用工廠方法來獲取單例對象。在這種寫法中,我們可以定義多個工廠方法來創(chuàng)建不同的單例對象。這種寫法的優(yōu)點是可以靈活地管理多個單例對象,同時在多線程環(huán)境下也是線程安全的。
這些是 Java單例模式的常見寫法,但這并不是絕對的,也可能有其他的寫法。單例模式的關(guān)鍵在于保證在整個程序運(yùn)行期間只有一個單例對象存在,因此在設(shè)計單例模式時要注意保證線程安全,并考慮程序的效率和可擴(kuò)展性。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧