執行緒安全單例模式的問題

2021-10-09 11:54:01 字數 2068 閱讀 6926

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...