(一)單利設計模式:
保證只有乙個例項,並提供乙個訪問它的全域性訪問點.
優點:
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...