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.提供公共的靜態的方法,返回類的物件 ...