單例模式的懶漢式在多執行緒的問題

2022-02-08 14:08:36 字數 2003 閱讀 8037

我們都知道,單例設計模式中有兩種方法,一種是餓漢式,另外一種就是懶漢式,具體如下:

餓漢式:

package

com.seven.exercise.testeception;

/*** 單例模式,餓漢式

* @author

seven *

*/public

class

singledemohunger

private

static singledemohunger sdh = new

singledemohunger();

public

static

singledemohunger getinstance()

}

懶漢式:

package

com.seven.exercise.testeception;

/*** 懶漢式

* @author

seven *

*/public

class

singledemo

private

static singledemo singledemo = null

;

/*** 提供獲取例項的方法

* @return

*/public

static

singledemo getinstance()

return

singledemo;

} }

但是懶漢式的話就有可能出現問題了,如多乙個執行緒執行到判斷是否為空的語句

if(singledemo==null)
的時候,當前執行緒被阻塞,而第二個執行緒進來了,這樣的話第二個執行緒建立了新的物件,那麼第乙個執行緒被喚醒的時候又建立多乙個物件,這樣在記憶體中就存在了兩個物件,明顯和單例設計模式不符,那麼我們應該怎麼做呢?

很簡單,用 synchronized關鍵字就可以輕鬆解決:

package

com.seven.exercise.testeception;

/*** 懶漢式

* @author

seven *

*/public

class

singledemo

private

static singledemo singledemo = null

;

/*** 提供獲取例項的方法,用synchronized來解決多執行緒的問題.

* @return

*/public

static

singledemo getinstance()

}return

singledemo;

}}

這樣就減少了建立多個例項的可能,但是還是存在建立多個例項的可能性,而且同步鎖肯定要消耗資源,這樣的話就會降低效率,那麼有什麼辦法可以提高效率呢?答案是有的,那就是通過二次判斷,這樣的話就不用每次都執行同步**塊,這樣的話,只需第一次執行的時候比較佔資源,以後的話就和之前的一樣了:

package

com.seven.exercise.testeception;

/*** 懶漢式

* @author

seven *

*/public

class

singledemo

private

static singledemo singledemo = null

;

/*** 提供獲取例項的方法,用synchronized來解決多執行緒的問題.

* @return

*/public

static

singledemo getinstance()}}

return

singledemo;

}}

所以,利用synchronized關鍵字解決多執行緒問題,用二次判斷提高效率~

單例模式,懶漢式在多執行緒中的問題

singleton2實現單例模式,懶漢式 class singleton2 private static singleton2 singleton2 public static singleton2 getsingle2 catch interruptedexception e singleton2...

設計模式 單例模式之懶漢式 多執行緒

package cn.itcast 03 單例模式 餓漢式 類一載入就建立物件 懶漢式 用的時候,才去建立物件 面試題 單例模式的思想是什麼?請寫乙個 體現。開發 餓漢式 是不會出問題的單例模式 面試 懶漢式 可能會出問題的單例模式 思想 a 懶載入 延遲載入 用的時候才去載入 b 執行緒安全問題 ...

多執行緒 單例模式之懶漢

1.懶漢 延遲載入 2.正確 3.效率還比較高 通過 1.volatile 的引入,目的解決 ins new 重排序帶來的問題 2.synchronized 的引入,目的是解決原子性問題 3.見方法注釋 public class lazysingleton3 乙個獲得 ins 的方法 public ...