java設計模式之單例模式

2021-09-06 15:02:28 字數 1960 閱讀 3635

在日常的開發中,有些物件我們只需要乙個,比如:配置檔案、工具類、執行緒池、快取、日誌物件等。如果創造出多個例項,就會導致很多問題,比如占用過多資源,不一致的結果等。

單例模式保證整個應用中某個例項有且只有乙個。單例模式,分為餓漢模式和懶漢模式。

1.餓漢模式

public class singleton 

// 2.建立類的唯一例項,使用private static修飾

private static singleton instance = new singleton();

// 3.提供乙個用於獲取例項的方法,使用public static修飾

public static singleton getinstance()

}

餓漢模式,是在物件沒有被使用之前就已經初始化。這就帶來了乙個問題:如果這個物件我們一直都沒有使用,這豈不是對資源的浪費?我們就沒有必要建立它,因此,只需要在用到的時候去建立。

2.懶漢模式

public class singleton

// 2.建立類的唯一例項,使用private static修飾

private static singleton instance;

// 3.提供乙個用於獲取例項的方法,使用public static修飾

public static singleton getinstance()

return instance;

}}

使用了延遲載入來保證物件在沒有使用之前,是不會進行初始化的。但是它不是執行緒安全,因此我們可以通過在獲取類的例項的靜態方法上,新增synchronized關鍵字來保證執行緒安全。

3.執行緒安全的單例模式

public class singleton 

// 2.建立類的唯一例項,使用private static修飾

private static singleton instance;

// 3.提供乙個用於獲取例項的方法,使用public static修飾

public static synchronized singleton getinstance()

return instance;

}

synchronized,限制了整個getinstance方法,因此這種方法效率不高。執行緒不安全的原因其實是在初始化物件的時候,所以,可以想辦法把同步的粒度降低,只在初始化物件的時候進行同步。這裡有必要提出一種新的設計思想——雙重檢查鎖(double-checked lock)。

public class singleton 

// 2.建立類的唯一例項,使用private static修飾

private static singleton instance;

// 3.提供乙個用於獲取例項的方法,使用public static修飾

public static singleton getinstance()}}

return instance;

}}

餓漢模式與懶漢模式的區別

餓漢模式的特點是載入類時比較慢,但執行時獲取物件的速度比較快,執行緒安全的;

懶漢模式的特點是載入類時比較快,但執行時獲取物件的速度比較慢,執行緒不安全的。

4.利用靜態內部類實現

public class singleton 

public static singleton getsingleton()

private static class holder

}

利用內部類持有靜態物件的方式實現,其理論依據是物件初始化過程種隱含的初始化鎖,這種和前面的雙重檢鎖實現,都能保證現場安全。

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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