單例模式是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瞬間憂傷了,本來以為發現新大陸了的,結果,哎!不死心,是什麼問題呢?為什麼會有兩個singleton呢?2 2
2 2
2 2
2 2
2 2
2 2
2
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一書中把單例模式歸類為 建立型 模式,意圖是在表明單例物件承擔了其他物件所要依賴的職責。單例模式的優點 在...