懶漢式和懶漢式執行緒安全(雙檢索)

2021-10-21 08:38:07 字數 1225 閱讀 3361

首先寫乙個單例的懶漢模式:

package thread;

/** 懶漢模式*/

public

class

sluggard

public

static sluggard getintance()

return instance;

}}

懶漢模式就是物件等到需要的時候在建立,單例執行緒不安全的,但是怎麼變得安全呢?

第一種方式:同步方法

public

static

synchronized sluggard getintance()

return instance;

}

第二種方式:同步**塊

public

static sluggard getintance()

return instance;

}}

這兩種都是效率比較慢的

第三種方式:雙檢索

public

static sluggard getintance()

}}return instance;

}

這種方式是不需要每一次都執行同步**塊的,單例模式建立了乙個物件之後判斷他不是null也就是不需要在執行同步**塊的。

但是這三種方式就是完全安全的嗎?

答案是不全是:

instance = new sluggard();

執行這個語句的順序一般是:

分配空間——>初始化物件——>instance指向分配的空間

但是某些編譯器上可能會出現編譯重排:

分配空間——>instance指向分配的空間——>初始化物件

分析一下:

其他的執行緒引用可能會指向這個分配的空間就會出錯。

但是怎麼才能避免呢?

答案是:

private

static

volatile sluggard instance =null;

在類靜態變數初始化的時候加乙個volatile關鍵字.

這個就是我了解的關於懶漢的面試題,希望大家遇到一定會.

餓漢式和懶漢式

先回顧一下餓漢式單例的寫法 餓漢式 class single public int getage 自定義構造方法 private single 自定義乙個物件 static single s new single public static single getinstance 餓漢式 先初始化物件...

惡漢式和懶漢式

惡漢式和懶漢式 區別 建立物件的時間不同 惡漢式在一開始就建立了物件,不管是否能用到此物件 惡漢式 public class singleton public static singleton getinstance 懶漢式在真正用到此物件時才建立 懶漢式 public class singleto...

懶漢式和餓漢式

餓漢式 public class hungrysingle 2.在類中建立乙個類的例項,私有化,靜態的 private static final hungrysingle hs new hungrysingle 3.通過公共方法呼叫,此公共方法只能類呼叫,因為設定了 static public st...