單例模式(餓漢式 懶漢式)

2021-09-26 18:38:29 字數 1373 閱讀 9927

2. 餓漢式(立即載入)

3. 懶漢式(延遲載入)

定義:單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的辦法。單例模式的要點有兩個:

public

class

singleton

//靜態方法,可以加入自定義控制,保證只產生乙個例項

public

static singleton getinstance()

return instance;}}

public

class

singletontest

}

在單例模式的實現過程中,需要注意以下三點:

優點:

缺點:立即載入就是使用類的時候已經將物件建立完畢,常見的實現方法是直接在宣告靜態物件的時候new例項化。即立即載入/餓漢式是在呼叫方法前,例項已經被建立了。

public

class

singleton

public

static singleton getinstance()

}

延遲載入就是在呼叫get()方法時例項才被建立,常見的實現方法是在get()方法中進行new例項化。

public

class

singleton

public

static singleton getinstance()

else

return singleton;

}}

缺點:多執行緒環境下,根本不能保證單例的狀態。

解決辦法:

public

class

singleton

public

static singleton getinstance()

else}}

return instance;

}}

這是一種懶漢的單例模式,使用時才建立物件,而且為了避免初始化操作的指令重排序,給instance加上了volatile

為什麼用了synchronized還要用volatile?具體來說就是synchronized雖然保證了原子性,但卻沒***指令重排序的正確性,會出現a執行緒執行初始化,但可能因為建構函式裡面的操作太多了,所以a執行緒的instance例項還沒有造出來,但已經被賦值了(即**中2操作,先分配記憶體空間後構建物件)。

而b執行緒這時過來了(發現instance不為null),錯以為instance已經被例項化出來,一用才發現instance尚未被初始化。要知道我們的執行緒雖然可以保證原子性,但程式可能是在多核cpu上執行。

單例模式 懶漢式 餓漢式

單例 1 訪問頻率高適合做成單例 2 這個類本身就是要描述乙個物件,就是想產生乙個物件就夠了,這樣的情況也是需要維護成乙個物件就ok 了 1 物件訪問高 建立物件不寄存客戶資料 適合 建立物件寄存客戶資料 不適合 第一步 把構造器變成私有的 構造器私有化 就是在別的地方new不成 靜態成員可以直接用...

單例模式(餓漢式 懶漢式)

所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法。public class singleton 靜態方法返回例項 public static singleton getstingleton 這種方式是執行緒安全的 p...

單例模式(懶漢式 餓漢式)

私有化類的構造器 內部建立類的物件 提供公共的靜態方法,返回類的物件 要求此物件也必須宣告為靜態的 餓漢式 class bank 2.內部建立類的物件 4.要求此物件也必須宣告為靜態的 private static bank instance newbank 3.提供公共的靜態的方法,返回類的物件 ...