public
class
singleton
implements
serializable
private
static
final singleton instance =
newsingleton()
;public
static singleton getinstance()
}
怕子類覆蓋父類裡的方法
反序列化也會生成新的物件,如果與單例模式中想要維護物件不同,就相當於破壞了單例。
解決方法
public object readresovle()
如果反序列化發現readresovle返回了物件,就會把其返回的物件當做結果。
private
singleton()
防止多次建立物件,不能防止反射。
private
static
final singleton instance =
newsingleton()
;
沒有執行緒安全問題,靜態成員變數的初始化在類載入的時候完成,由jvm保證了執行緒的安全。
提供更好的封裝性,可以提供懶惰的初始化;可以提供泛型的支援;對建立單例變數有更好的控制。
enum singleton
由列舉控制,是單例項的。
沒有。因為它也是靜態成員變數。
不能用反射破壞。拿不到構造方法,不能實現反射。
列舉在實現的時候就繼承了序列化的介面,不能被破壞。
餓漢式的
新增構造方法,實現初始化。
class
singleton
//2.本類內部建立物件例項
private
static singleton instance;
//提供乙個靜態的公有方法,加入同步處理的**,解決執行緒安全問題
//即懶漢式
public
static
synchronized singleton getinstance()
return instance;
}}
public static synchronized singleton getinstance()
return instance;
}
在上述地方會出現效率低下,第一次的訪問的時候,通過同步鎖建立物件,但是物件建立了之後,可以不通過同步鎖訪問了,同步鎖的範圍太大了。
class
singleton
//2.本類內部建立物件例項
private
static
volatile singleton instance;
//提供乙個靜態的公有方法,當使用到該方法時,才去建立instance
//即懶漢式
public
static singleton getinstance()
}}return instance;
}}
指令可能會重排序,同步**塊可能先賦值,再去建立物件,同步**塊外面的物件可能會拿到不完整的物件。
第一次呼叫的話,會繼續建立物件,但是第
二、第三次呼叫,可以直接判斷,不用再通過同步**了,提公升了效率。
為了防止首次多執行緒的呼叫,如果同時有兩個執行緒都進到**塊時,可以防止多次建立物件。
class
singleton
private
static
class
singletoninstance
//提供乙個靜態的公有方法,當使用到該方法時,才去建立instance
//即懶漢式
public
static singleton getinstance()
}
利用靜態內部類特點實現延遲載入,效率高 單例模式的執行緒安全問題
單例會帶來什麼問題?如果多個執行緒同時呼叫這個例項,會有執行緒安全的問題 單例一般用在什麼地方?單例的目的是為了保證執行時只有唯一的乙個例項,最常用的地方比如拿到資料庫的連線,或者spring的中建立beanfactory操作,而這些操作都是呼叫他們的方法來執行某個特定的動作。首先先來認識下兩種模式...
單例模式的執行緒安全問題
大家都知道單例模式有兩種,分別是懶漢式 餓漢式。但是對於餓漢式,由於判斷例項為null與建立物件的操作並不是乙個原子性操作,故在 普通的懶漢式單例 非執行緒安全問題 1 2 created by ywb 3 4public class singleton 910 public static sing...
執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...