java設計模式之 單例模式

2021-08-17 14:18:26 字數 1932 閱讀 1743

(一)單利設計模式:

保證只有乙個例項,並提供乙個訪問它的全域性訪問點.

優點:

a,只有乙個例項,避免了頻繁建立個銷毀物件,提高效能.

b,防止其他物件對自己的例項化,確保所有物件都訪問這乙個例項.

缺點:a,沒有抽象層,擴充套件優點困難.

適用場景:

a.需要頻繁例項化然後銷毀的物件。 

b.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。 

c.有狀態的工具類物件。 

d.頻繁訪問資料庫或檔案的物件。 

1,餓漢式:

避免了多執行緒的同步問題,但在類的載入時就完成初始化,類載入較慢,而且沒有達到懶載入的效果,會造成記憶體浪費.不推薦

public classsingleleton

public staticsingleleton getinstance() }

2,懶漢式:

在第一次呼叫時初始化,雖然節約了資源,但執行緒不安全.不推薦

public classsingleleton

public staticsingleleton getinstance()

returninstance;}

} 3,懶漢式加鎖:

執行緒安全,但每個呼叫getinstance()方法都要同步,造成不必要的同步開銷.不推薦

public classsingleleton

public static synchronizedsingleleton getinstance()

returninstance;}

4,雙重檢查鎖:

兩次判空,第一次是為了不必要的同步,第二次是在singleton為null時建立,效率高,資源利用率高.

雖然使用了volatile會影響一點效能,但考慮程式的正確性,犧牲這點值得.

解決了執行緒安全,資源消耗和多餘同步的問題,但有時候會出現失效的問題.也不怎麼推薦

private static volatilesingleleton

instance

;publicsingleleton() {}

public staticsingleleton getinstance() }}

returninstance;}

} eventbus採用的就是這種建立方式

public class eventbus }}

return defaultinstance;

}

5,靜態內部類:

第一次載入singleton類是不會初始化,只有在第一次呼叫getinstance()方法時,虛擬機器才載入singletonholder並初始化.

確保了執行緒安全,也能解決singleleton唯一性.

推薦使用這種模式.

public singleleton(){}

public static singleleton getinstance()

public static class singleletonholder

6,列舉:

因為在開發中很少用,也耗記憶體,可讀性不高,自己也沒用過,就不介紹了.

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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