Java單例模式結合JUC原子類爆發的新想法

2021-07-04 17:33:35 字數 1713 閱讀 7192

單例模式是23種設計模式中的一種,關於它的介紹,已經數不勝數了,一般網上的實現方式無非是什麼懶漢式,餓漢式,內部類,列舉,volatile加雙重校驗鎖等等,今天我又想到乙個新的實現方式,利用j.u.c提供的原子類,**如下:

class singleton 

public

static singleton getinstance()

return reference.get();

}}

測試:

1. 測試執行緒類

class

testthread

extends

thread

@override

public

void run()

for (int i = 0; i < number; i++)

}hashset.add(singleton.getinstance());

system.out.println("當前hashset大小:" + hashset.size());

}}

測試例項

hashsethashset = new hashset<>();

int number = 50;

testthread threads = new testthread[number];

for (int i = 0; i

< number; i++)

for (int i = 0; i

< number; i++)

然而結果並不明朗,某些情況下,列印出的結果為:

2

2 2

2 2

2 2

2 2

2 2

2 2

2

瞬間憂傷了,本來以為發現新大陸了的,結果,哎!不死心,是什麼問題呢?為什麼會有兩個singleton呢?

ok,修改測試方法:

hashsethashset = new hashset<>();

int number = 50;

testthread threads = new testthread[number];

for (int i = 0; i < number; i++)

for (int i = 0; i < number; i++)

thread.sleep(3000);

if (hashset.size() > 1)

}

雖然結果還是有2,3,1,但是,最後的列印資訊顯示,hashset中只有乙個singleton例項。這是為什麼呢?因為hashset是非執行緒安全的,在多執行緒環境下,容易發生狀態不一致的情況。我們換成copyonwritearrayset再來試一下。

class

testthread

extends

thread

@override

public

void run()

for (int i = 0; i < number; i++)

}hashset.add(singleton.getinstance());

system.out.println(hashset.size());

}}

java單例模式

第一種方法 public class singleton private static singleton singleton new singleton public static singleton getinstance 第二種方法 public class singleton private...

Java 單例模式

單例模式特點 1 單例類只能有乙個例項。2 單例類必須自己自己建立自己的唯一例項。3 單例類必須給所有其他物件提供這一例項。一 餓漢式單例 基於classloder機制避免了多執行緒的同步問題,使用較多 public class singleton 這裡提供了乙個供外部訪問本class的靜態方法,可...

Java單例模式

單例模式的意圖是為了確保乙個類有且僅有乙個例項,並為它提供乙個全域性訪問點。單例模式通過隱藏建構函式,提供物件建立的唯一入口點,從而將類的職責集中在類的單個例項中。design patterns一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...