Java設計模式之單例模式

2021-07-24 23:30:11 字數 2250 閱讀 5232

更加優雅的寫法對比

單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個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...