哆啦的時(shí)光機(jī)
2019-01-17 14:26:46
1、如下代碼
package gof.singleton;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
//多線程安全
public class Singleton2 {
private static Singleton2 singleton = new Singleton2();
private Singleton2() {}
public static Singleton2 getSingleton() {
return singleton;
}
public static void main(String[] args) throws InterruptedException {
for(int j = 0;j<10;j++) {
CountDownLatch c = new CountDownLatch(1000);
Set<Singleton2> list = new HashSet<Singleton2>();
for(int i= 0 ;i<1000;i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(Singleton2.getSingleton());
c.countDown();
}
}).start();
}
c.await();
System.out.println(list + "-" + list.size());
//list.stream().forEach(System.out::println);
}
}
}
2、一種可能的結(jié)果
[gof.singleton.Singleton2@a627065]-3
[gof.singleton.Singleton2@a627065]-5
[gof.singleton.Singleton2@a627065]-2
[gof.singleton.Singleton2@a627065]-5
[gof.singleton.Singleton2@a627065]-2
[gof.singleton.Singleton2@a627065]-1
[gof.singleton.Singleton2@a627065]-4
[gof.singleton.Singleton2@a627065]-3
[gof.singleton.Singleton2@a627065]-1
[gof.singleton.Singleton2@a627065]-3
3、問(wèn)題為什么集合中元素和打印的個(gè)數(shù)不匹配### 題目描述
題目來(lái)源及自己的思路
相關(guān)代碼
// 請(qǐng)把代碼文本粘貼到下方(請(qǐng)勿用圖片代替代碼)
你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?
2 回答

慕桂英4014372
TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
HashSet使用add方法就是調(diào)HashMap的put方法,list.size()就是HashMap的size()方法,返回HashMap的size屬性,
list的size大于1是因?yàn)镠ashMap并發(fā)導(dǎo)致線程安全問(wèn)題。
換成Set<Singleton2> list =Collections.synchronizedSet(new HashSet<Singleton2>());即可

慕蓋茨4494581
TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
Java 關(guān)于 HashSet 的文檔中明確表明該類不是線程安全的,所以絕對(duì)不要用多個(gè)線程操作同一個(gè) HashSet 對(duì)象。
添加回答
舉報(bào)
0/150
提交
取消