跑起一個程式,并不難;難的是,能讓程式跑多遠!—— 一顆剽悍的種子

JUC并發系列
JUC并發系列(一):什么?聽說你搞混了并發和并行
JUC并發系列(二):詳解Condition實作精準通知喚醒
JUC并發系列(三):面試問并發,一問鎖就懵(怒肝一篇透徹理解鎖,面試不慌)
JUC并發系列(四):【面試常問】多種方法解決ArrayList非執行緒安全,詳解CopyOnWriteArrayList
一、HashSet非執行緒安全
看過上一篇關于CopyOnWriteArrayList以及ArrayList非執行緒安全的小伙伴會發現其實這篇也很相似呀,因為ArrayList和HashSet除了區別于前者ArrayList是有序,可重復的,而后者HashSet是無序,且不可重復外,ArrayList和HashSet都是非執行緒安全的,包括我們下一篇即將講的HashMap也都是非執行緒安全(如果不涉及多執行緒并發問題,它們都是最常用且性能較好的)
JUC并發系列(四):【面試常問】多種方法解決ArrayList非執行緒安全,詳解CopyOnWriteArrayList
1.1 HashSet非執行緒安全代碼示例
public class Demo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(set.size());
}
}
運行結果

二、synchronizedSet解決HashSet非執行緒代碼示例
Set<String> set = Collections.synchronizedSet(new HashSet<>());
public class Demo {
public static void main(String[] args) {
Set<String> set = Collections.synchronizedSet(new HashSet<>());
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(set.size());
}
}
運行結果

三、 CopyOnWriteArraySet解決HashSet非執行緒安全
Set<String> set = new CopyOnWriteArraySet<>();
public class Demo {
public static void main(String[] args) {
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 10000; i++) {
new Thread(() -> {
set.add(Thread.currentThread().getName());
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(set.size());
}
}
四、最后
最后的最后,為了更好的閱讀體驗,我把想說的話都放在了下面,嘿嘿,
我是一顆剽悍的種子 把我會的,認真的分享 是我寫博客一直不變的信條,
如果你能看到這篇博文,說明咱們還是很有緣的;希望能帶給你一些許幫助,創作的不易, 把我文章的知識帶走,你的三連留下,點贊,評論,關注,是我最大的動力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/125000.html
標籤:其他
上一篇:python
下一篇:pycharm添加自定義函式報錯
