網(wǎng)站seo問題診斷工具網(wǎng)絡(luò)營銷的概念及內(nèi)容
個人簡介:Java領(lǐng)域新星創(chuàng)作者;阿里云技術(shù)博主、星級博主、專家博主;正在Java學(xué)習(xí)的路上摸爬滾打,記錄學(xué)習(xí)的過程~
個人主頁:.29.的博客
學(xué)習(xí)社區(qū):進(jìn)去逛一逛~
單例設(shè)計(jì)模式
- Java單例設(shè)計(jì)模式
Java單例設(shè)計(jì)模式
- 單例設(shè)計(jì)模式(Singleton):單例即唯一實(shí)例,某個類在整個系統(tǒng)中只能有一個實(shí)例對象可被獲取和使用的代碼模式。(例如:代表
JVM
運(yùn)行環(huán)境的Runtime類)
要點(diǎn)
:
- ①某個類只能有一個實(shí)例。
-
- 構(gòu)造器私有化。
- ②這個類必須自行創(chuàng)建這個實(shí)例。
-
- 含有一個該類的靜態(tài)變量來保存這個唯一的實(shí)例。
- ③這個類必須自行向整個系統(tǒng)提供這個實(shí)例。
-
- 對外提供獲取該實(shí)例的方式:
-
-
- 直接暴露
- 用靜態(tài)變量的get方法獲取
-
餓漢式
:
- 餓漢式:直接創(chuàng)建對象,不存在線程安全問題。(在類初始化時直接創(chuàng)建對象,不管你是否需要這個對象都會創(chuàng)建)
- 實(shí)現(xiàn)方式:
-
- 直接實(shí)例化餓漢式(簡潔明了)
- 枚舉式(最簡潔)
- 靜態(tài)代碼塊餓漢式(適合復(fù)雜實(shí)例化)
- 直接實(shí)例化
//Singleton:單例設(shè)計(jì)模式,軟件開發(fā)中常見的設(shè)計(jì)模式之一//單例設(shè)計(jì)模式——餓漢式1:直接實(shí)例化餓漢式
/** 1.構(gòu)造器私有化* 2.自行創(chuàng)建,并且用靜態(tài)變量保存* 3.向外提供這個實(shí)例* 4.使用final修飾,強(qiáng)調(diào)這是一個單例*/
public class Singleton_hungry1 {//直接實(shí)例化private static final Singleton_hungry1 INSTANCE = new Singleton_hungry1();//構(gòu)造器私有化private Singleton_hungry1(){}}
- 枚舉式
/*** 枚舉類型:表示該類型的變量是有限的幾個* 我們可以限定為一個,從而成了單例**/
public enum Singleton_hungry2 {//枚舉類型的實(shí)例INSTANCE;private Singleton_hungry2() {}
}
- 靜態(tài)代碼塊
public class Singleton_hungry3 {public static final Singleton_hungry3 INSTANCE;static {//復(fù)雜情況在靜態(tài)代碼塊中解決INSTANCE = new Singleton_hungry3();}private Singleton_hungry3() {}
}
懶漢式
:
- 懶漢式:延遲創(chuàng)建對象。
- 實(shí)現(xiàn)方式:
- 線程不安全(適用于單線程)
- 線程安全(適用于多線程)
- 靜態(tài)內(nèi)部類形式(適用于多線程)
- 線程不安全
/** 懶漢式:延遲創(chuàng)建這個實(shí)例對象* 1. 構(gòu)造器私有化* 2.用一個靜態(tài)變量保存唯一實(shí)例* 3.提供一個靜態(tài)方法,用于獲取實(shí)例*/
public class Singleton4 {private static Singleton4 instance;private Singleton4() {}//線程不安全public static Singleton4 getInstance() {if(instance == null) {instance = new Singleton4();}return instance;}}
- 線程安全
public class Singleton5 {private static Singleton5 instance;private Singleton5() {}public static Singleton5 getInstance() {//上鎖、線程安全synchronized(Singleton5.class){if(instance == null) {instance = new Singleton5();}}return instance;}}
- 靜態(tài)內(nèi)部類形式
/** 懶漢式:延遲創(chuàng)建這個實(shí)例對象* 1. 構(gòu)造器私有化* 2.用一個靜態(tài)變量保存唯一實(shí)例* 3.提供一個靜態(tài)方法,用于獲取實(shí)例*/
public class Singleton6 {private Singleton6() {}//內(nèi)部類:靜態(tài)內(nèi)部類不會隨著外部類的加載和初始化而初始化,它是要單獨(dú)去加載和初始化的//唯一實(shí)例因?yàn)槭窃趦?nèi)部類加載和初始化時才創(chuàng)建的,所以線程安全private static class inner{//唯一實(shí)例: 在內(nèi)部類被加載和初始化時才被創(chuàng)建private static Singleton6 instance = new Singleton6();}public static Singleton6 getInstance() {return inner.instance;}}