單例模式8種寫法及分析

2021-10-02 12:47:13 字數 3479 閱讀 2314

最近複習了下單例模式寫法,記錄下來,分析每種優缺點

其中標紅的是推薦方式,有雙重檢查模式,還有列舉模式

* 優點:編寫簡單 不存在併發問題 多個執行緒建立多個例項

* 缺點:一開始就載入,浪費資源.

/**

* @author: xuxu

* @date 2020/2/2 16:08

* @description: 第一種單例模式寫法

* 餓漢式 靜態變數方式(可用)

* 優點:編寫簡單 不存在併發問題 多個執行緒建立多個例項

* 缺點:一開始就載入,浪費資源.

*/public class singleton01 ;

public static singleton01 instance()

//測試

public static void main(string args)

}

優點缺點和第一種類似 只是寫法不同
/**

* @author: xuxu

* @date 2020/2/2 16:12

* @description: 第二種單例模式建立方式

* 餓漢式 靜態塊模式(可用)

* 優點缺點和第一種類似 只是寫法不同

*/public class singleton02

private singleton02 ()

public static singleton02 instance()

public static void main(string args)

}

* 優點:懶載入,節省記憶體 使用時才例項化
/**

* @author: xuxu

* @date 2020/2/2 16:16

* @description:

* * 第三種方式

* 懶漢式 (不可用)

* 優點:懶載入,節省記憶體 使用時才例項化

*/public class singleton03 ;

public static singleton03 instance()

return instance;

}}

* 優點:懶載入,用synchronized關鍵字修飾 避免執行緒安全問題

* 缺點:每次呼叫該方式獲取例項都會加鎖,效能上有影響

/**

* @author: xuxu

* @date 2020/2/2 16:20

* @description:

* 第4種建立方式 懶漢式 同步鎖(可用)

* 優點:懶載入,用synchronized關鍵字修飾 避免執行緒安全問題

* 缺點:每次呼叫該方式獲取例項都會加鎖,效能上有影響

*/public class singleton04 ;

public static synchronized singleton04 instance()

return instance;

}}

* 優點:懶載入,每次呼叫該方式獲取例項前先判斷是否例項已經存在,不存在才加鎖

* 缺點:雖然建立時加了鎖,但是前面的判斷同樣存在併發問題 比如兩個執行緒都通過了判斷.然後再獲取鎖

/**

* @author: xuxu

* @date 2020/2/2 16:20

* @description:

* 第5種建立方式 懶漢式 同步鎖(不可用)

* 優點:懶載入,每次呼叫該方式獲取例項前先判斷是否例項已經存在,不存在才加鎖

* 缺點:雖然建立時加了鎖,但是前面的判斷同樣存在併發問題 比如兩個執行緒都通過了判斷.然後再獲取鎖

*/public class singleton05 ;

public static singleton05 instance()

}return instance;

}}

* 缺點:編寫**複雜,volatile容易遺漏

/**

* @author: xuxu

* @date 2020/2/2 16:20

* @description:

* 第6種建立方式 懶漢式 雙重檢查模式 (面試時推薦用)

* 缺點:編寫**複雜,volatile容易遺漏

*/public class singleton06 ;

public static singleton06 instance()}}

return instance;

}}

/**

* @author: xuxu

* @date 2020/2/2 16:20

* @description:

* 第7種建立方式 靜態內部類方式(可用)

* 內部類的特點:

* 1.只能在內部類中定義靜態類

* 2.靜態內部類與外層類繫結,即使沒有建立外層類的物件,它一樣存在。

* 3.靜態類的方法可以是靜態的方法也可以是非靜態的方法,靜態的方法可以在外層通過靜態類呼叫,而非靜態的方法必須要建立類的物件之後才能呼叫。

* 5.只能引用外部類的static成員變數(也就是類變數)。

* 6.如果乙個內部類不是被定義成靜態內部類,那麼在定義成員變數或者成員方法的時候,是不能夠被定義成靜態的。

* 優點:

* 缺點:

*/public class singleton07 ;

private static class innersingleton

public static singleton07 instance()

public static void main(string args)

}

* 優點:

* 我們定義的乙個列舉,在第一次被真正用到的時候,會被虛擬機器載入並初始化,而這個初始化過程是執行緒安全的

* 1.**簡潔

* 2.可以防止反射破壞單例模式

* 3.執行緒安全

/**

* @author: xuxu

* @date 2020/2/2 17:43

* @description: 列舉(最好的方法)

* 優點:

* 我們定義的乙個列舉,在第一次被真正用到的時候,會被虛擬機器載入並初始化,而這個初始化過程是執行緒安全的

* 1.**簡潔

* 2.可以防止反射破壞單例模式

* 3.執行緒安全

*/public enum singleton08

public static void main(string args)

}

模式 單例模式8種寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到餓漢式和懶漢式這兩種實現方式。但是除了這兩種方式,本文還會介紹其他幾種實現單例的方式,讓我們來一起看看吧。單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系...

單例模式的8種寫法

個人部落格 小景哥哥 單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通...

單例的8種寫法

單例模式是最常用到的設計模式之一,熟悉設計模式的朋友對單例模式都不會陌生。一般介紹單例模式的書籍都會提到 餓漢式 和 懶漢式 這兩種實現方式。但是除了這兩種方式,還有其他幾種實現單例的方式。簡介單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個...