更加優雅的寫法對比
單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,以避免兩個列印作業同時輸出到印表機中。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。
包含三個部分:
//乙個私有靜態的物件
private
static emperor singleton;
// 私有的構造方法
private
emperor()
// 公共的返回物件的方法
public
static emperor getsingleton()
private
static
final emperor singleton = new emperor();
// 私有的構造方法
private
emperor()
// 公共的返回物件的方法
public
static emperor getsingleton()
餓漢式天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題
public
class emperor
// 公共的返回物件的方法
public
static emperor getsingleton()
return singleton;
}}
不適合多執行緒的環境,改進,加入鎖的機制
public
class emperor
// 公共的返回物件的方法
public synchronized static emperor getsingleton()
return singleton;
}}
缺點:第一次載入反應慢(初始化變數),每次呼叫getsingleton都會同步,浪費資源
public
class emperor
// 公共的返回物件的方法
public
static emperor getsingleton() }}
return singleton;
}}
解決了每次呼叫getsingleton都會同步的問題,但是第一次載入反應慢(初始化變數)是懶漢單例模式的通病
但是假設執行緒a執行到singleton = new emperor()這句話都三個基本操作:
1、給singleton 分配記憶體;
2、呼叫emperor()建構函式,初始化成員變數;
3、把singleton 物件指向指定的記憶體空間;
但是2和3是沒有先後順序的,假設a執行132,那麼現在是2然後執行緒b執行完1,不會初始化,b的值就是null,造成dcl失效(雙重檢查鎖定失效),在jdk1.5之後引入關鍵字volatile
public
class emperor
// 公共的返回物件的方法
public
static emperor getsingleton() }}
return singleton;
}}
使用靜態內部類的單例模式
// 內部類中初始化
private
static
class singletonholder
// 私有的構造方法
private
emperor()
// 公共的返回物件的方法
public
static emperor getsingleton()
評價上述的單例模式有三個角度:執行緒安全?第一次呼叫例項方法延遲載入?每次呼叫方法耗費大量資源?
評價角度
懶漢餓漢
內部類執行緒安全
可以後加
天生天生
第一次載入延遲是否
是耗費資源
具體而定少少
android在載入庫經常使用單例模式
參考:csdn
github連線:github
java設計模式之單例模式
單位面試題目中有一道關於單例模式的題目.大多數參加筆試的同事都會寫出getinstance這個函式,但是當我問起什麼情況下需要使用單例 單例具體有什麼好處的時候 static函式也可以構建唯一例項,為什麼還需要單例.從使用單例的經驗來看,如下場景下,個人感覺應該使用單例 1.如果需要構建乙個工具類,...
java設計模式 之 單例模式
單例模式 有些類在程式執行過程中只需要儲存乙個例項,比如檔案管理類,音訊管理類,那麼我們如何實現乙個單例類呢?有以下幾點 1 定義乙個靜態變數 2 建構函式私有化 3 提供乙個public 靜態方法,獲取這個例項 4 一定要做執行緒同步 public static class singleton p...
Java設計模式之單例模式
說到單例模式 大家一定非常熟悉 這是最常見也是設計模式中相對簡單 好理解的設計模式 今天就跟大家掰一掰單例模式 單例模式確保某個類只有乙個例項 應用場景 執行緒池 快取 等物件常常被設計成單例 然而單例分兩種 1 惡漢式 2 懶漢式 我們先來看下 惡漢式 public class singleton...