單例模式裡有懶漢式和餓漢式,在多執行緒下需要用特殊的方式保證執行緒安全。
下面我用一種方式實現餓漢式單例,兩種方式實現懶漢式單例
多執行緒下餓漢式單例:
//使用final修飾:防止子類覆蓋父類中的方法,破壞單例
public
final
class
singleton
implements
serializable
//建立例項,將其設定為static和final
private
static
final singleton instance=
newsingleton()
;//提供靜態方法獲取建立的例項
public
static singleton getinstance()
//反序列化時,返回自己建立的例項而不是位元組碼生成的例項
public object readresolve()
}
多執行緒下懶漢式單例:dcl方式
public class singleton
//先定義例項化物件為null,並且用volatitle修飾
//加volatile的修飾的原因:因為同步**塊中的指令可能發生指令重排序,因為同步**塊內的構造方法和其賦值的指令,
//如果不加volatitle,這兩個位元組碼指令可能會重排序,即先執行完賦值,再去呼叫構造方法
// 若此時有第二個執行緒來獲取例項,則會產生錯誤(拿到的是沒有呼叫構造前的值)
private static volatile singleton instance=null;
//建立例項的方法
public static singleton getinstance()
synchronized (singleton.class)
instance=new singleton();
return instance;
}
}
去掉注釋:
public
class
singleton
private
static
volatile singleton instance=null;
public
static singleton getinstance()
synchronized
(singleton.
class
) instance=
newsingleton()
;return instance;}}
}
多執行緒下懶漢式單例:使用靜態內部類
public class singleton
//定義靜態內部類,建立例項
private
static
class
lazyholder
//提供獲取例項的方法
public
static singleton getinstance()
}//如何保證其單例的?
//因為靜態內部類對外不可見,其載入方式也是懶漢式的,只有用到其實例時才建立
//比如,若是只使用singleton,而沒有用getinstance(),不會觸發靜態內部類的載入,因而也不會去建立例項
//又由於類載入時建立的例項是jvm完成的,可以由jvm保證其執行緒安全性
多執行緒下的單例
1多執行緒安全單例模式一 不使用同步鎖 1 1 public classsingleton 4 4 private staticsingleton singleton 5 5 6 6 public staticsingleton getinstance 7 7 12 12 returnsinglet...
多執行緒下的單例(靜態類單例)
定義乙個單例model package com.shirt.test author xiaxt date 2018 12 21.public class runmodel private runmodel setisrunning boolean b private runmodel setmess...
多執行緒下的單例模式
單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...