java設計模式之單例模式

2021-07-15 02:34:50 字數 1592 閱讀 2755

單例模式:保證類在記憶體中只有乙個物件。

分為:餓漢式:類一載入就建立物件     經典案例:jdk中的runtime類

懶漢式:用的時候,才去建立物件

如何保證類在記憶體中只有乙個物件呢?

a:把構造方法私有

b:在成員位置自己建立乙個物件

c:通過乙個公共的方法提供訪問單例模式:保證類在記憶體中只有乙個物件。

a.餓漢式(是不會出問題的單例模式):

public class student 

// 自己造乙個

// 靜態方法只能訪問靜態成員變數,加靜態

// 為了不讓外界直接訪問修改這個值,加private

private static student s = new student();

// 提供公共的訪問方式

// 為了保證外界能夠直接使用該方法,加靜態

public static student getstudent()

}

測試類:

public class studentdemo

}

b.懶漢式(可能會出問題的單例模式):

a:懶載入(延遲載入)

b:執行緒安全問題

public class teacher 

private static volatile teacher t = null;

// volatile關鍵字在下方解釋

public static teacher getteacher()

}} return t;

}}

測試類:

public class teacherdemo

}

後記:關於volatile關鍵字

t = new teacher();這行**中,他的指令大致可分為三步:

1:給物件分配位址空間。

2:初始化物件。

3:將 t 引用指向剛剛分配的位址。

編譯器會對指令進行重排序,從而導致部分jit編譯器會出現獲得的物件是乙個還未經過初始化的物件。重排序大概可以理解為:處理器不會按照你**的順序去執行,而是根據一定的優化規律,在幾個指令的執行結果不互相

影響的情況下將其重新排序再執行。

因為第一步的執行結果跟第二三步是緊密相連的,換句話說就是只有分配了空間,才能有空間進行初始化,引用才能指向分配的位址,也就是說第一步的執行結果影響到了第二三步,所以第一步肯定是先執行。 

而第二三步之間沒有必然的聯絡,就算是交換了順序,最終的結果還是一樣,因此處理器有可能先執行了第三步,執行第三步後也就是說t 已經不為null了,此時乙個新的執行緒進入第一次判斷,結果為false,便return了該物件,可是此時該物件並沒有進行初始化!

解決這個問題的方法便是用volatile關鍵字去修飾t 變數

該關鍵字的乙個重要作用就是禁止指令重排序優化,普通的變數僅僅會保證該方法的執行過程中所有依賴賦值結果的地方都能獲取到正確的結果,而不能保證變數賦值操作順序與程式**中的執行順序一致。

java設計模式之單例模式

單位面試題目中有一道關於單例模式的題目.大多數參加筆試的同事都會寫出getinstance這個函式,但是當我問起什麼情況下需要使用單例 單例具體有什麼好處的時候 static函式也可以構建唯一例項,為什麼還需要單例.從使用單例的經驗來看,如下場景下,個人感覺應該使用單例 1.如果需要構建乙個工具類,...

java設計模式 之 單例模式

單例模式 有些類在程式執行過程中只需要儲存乙個例項,比如檔案管理類,音訊管理類,那麼我們如何實現乙個單例類呢?有以下幾點 1 定義乙個靜態變數 2 建構函式私有化 3 提供乙個public 靜態方法,獲取這個例項 4 一定要做執行緒同步 public static class singleton p...

Java設計模式之單例模式

說到單例模式 大家一定非常熟悉 這是最常見也是設計模式中相對簡單 好理解的設計模式 今天就跟大家掰一掰單例模式 單例模式確保某個類只有乙個例項 應用場景 執行緒池 快取 等物件常常被設計成單例 然而單例分兩種 1 惡漢式 2 懶漢式 我們先來看下 惡漢式 public class singleton...