我們都知道,單例設計模式中有兩種方法,一種是餓漢式,另外一種就是懶漢式,具體如下:
餓漢式:
packagecom.seven.exercise.testeception;
/*** 單例模式,餓漢式
* @author
seven *
*/public
class
singledemohunger
private
static singledemohunger sdh = new
singledemohunger();
public
static
singledemohunger getinstance()
}
懶漢式:
packagecom.seven.exercise.testeception;
/*** 懶漢式
* @author
seven *
*/public
class
singledemo
private
static singledemo singledemo = null
;
/*** 提供獲取例項的方法
* @return
*/public
static
singledemo getinstance()
return
singledemo;
} }
但是懶漢式的話就有可能出現問題了,如多乙個執行緒執行到判斷是否為空的語句
if(singledemo==null)的時候,當前執行緒被阻塞,而第二個執行緒進來了,這樣的話第二個執行緒建立了新的物件,那麼第乙個執行緒被喚醒的時候又建立多乙個物件,這樣在記憶體中就存在了兩個物件,明顯和單例設計模式不符,那麼我們應該怎麼做呢?
很簡單,用 synchronized關鍵字就可以輕鬆解決:
packagecom.seven.exercise.testeception;
/*** 懶漢式
* @author
seven *
*/public
class
singledemo
private
static singledemo singledemo = null
;
/*** 提供獲取例項的方法,用synchronized來解決多執行緒的問題.
* @return
*/public
static
singledemo getinstance()
}return
singledemo;
}}
這樣就減少了建立多個例項的可能,但是還是存在建立多個例項的可能性,而且同步鎖肯定要消耗資源,這樣的話就會降低效率,那麼有什麼辦法可以提高效率呢?答案是有的,那就是通過二次判斷,這樣的話就不用每次都執行同步**塊,這樣的話,只需第一次執行的時候比較佔資源,以後的話就和之前的一樣了:
packagecom.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 ...