Java設計模式之單例模式

2021-09-24 14:29:31 字數 1827 閱讀 7586

定義

單例模式(singleton pattern):確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。

特點1、單例類只能有乙個例項。

2、單例類必須自己建立自己的唯一例項。

3、單例類必須給所有其他物件提供這一例項。

幾種實現方式

餓漢式

public

class

singletonhungry

public

static singletonhungry getinstance()

}

缺點:singleton例項在什麼時候被建立是不受控制的,對於靜態成員singletonhungry,它會在類第一次初始化的時候被建立,如果該函式裡面有乙個靜態成員變數,外部有方法引用了這個靜態成員變數,該類就會被初始化,那麼singletonhungry也會被建立。

解決辦法如下:

只有在getinstance()方法被第一次呼叫的時候,singletonhungry的例項才會被建立,這個方法巧妙地使用了內部類和類的初始化方法,內部類singletonholder被申明為private,使得我們不可能在外部訪問並初始化他,只可能在getinstance()內部對singletonholder類進行初始化,利用虛擬機器的類初始化機制建立單例。

public

class

singletonhungry

private

static

class

singletonholder

public

static singletonhungry getinstance()

}

懶漢式

執行緒不安全,也就是說第乙個執行緒剛好執行到判斷為null的時候,第二個執行緒也進來了,這樣就造成了生成兩個例項。

public

class

singletondemo

/** * 這裡用到static是因為這個類建構函式私有化了,不能new例項出來,只有用類直接呼叫靜態方法

* @return

* @throws singletonexception

*/public

static singletondemo getsingleton()

return singletondemo;

}public

void

showsingleton()

}

懶漢式執行緒安全

直接在建立例項的方法上加synchronized ,這樣雖然避免了執行緒不安全的問題,但是執行效率會很低。

public

static

synchronized singletondemo getsingleton()

return singletondemo;

}

懶漢式高效執行緒安全

當把變數宣告為volatile型別後,編譯器與執行時都會注意到這個變數是共享的,因此不會將該變數上的操作與其他記憶體操作一起重排序。volatile變數不會被快取在暫存器或者對其他處理器不可見的地方,因此在讀取volatile型別的變數時總會返回最新寫入的值。

public

class

singletondemo

public

static singletondemo getsingleton()

}}return singletondemo;

}public

void

showsingleton()

}

java設計模式之單例模式

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

java設計模式 之 單例模式

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

Java設計模式之單例模式

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