跑起一個程式,並不難;難的是,能讓程式跑多遠!—— 一顆剽悍的種子
JUC並行系列
JUC並行系列(一):什麼?聽說你搞混了並行和並行
JUC並行系列(二):詳解Condition實現精準通知喚醒
JUC並行系列(三):面試問並行,一問鎖就懵(怒肝一篇透徹理解鎖,面試不慌)
JUC並行系列(四):【面試常問】多種方法解決ArrayList非執行緒安全,詳解CopyOnWriteArrayList
看過上一篇關於CopyOnWriteArrayList以及ArrayList非執行緒安全的小夥伴會發現其實這篇也很相似呀。因為ArrayList和HashSet除了區別於前者ArrayList是有序,可重複的,而後者HashSet是無序,且不可重複外,ArrayList和HashSet都是非執行緒安全的,包括我們下一篇即將講的HashMap也都是非執行緒安全(如果不涉及多執行緒並行問題,它們都是最常用且效能較好的)
JUC並行系列(四):【面試常問】多種方法解決ArrayList非執行緒安全,詳解CopyOnWriteArrayList
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());
}
}
執行結果
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());
}
}
執行結果
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());
}
}
最後的最後,為了更好的閱讀體驗,我把想說的話都放在了下面,嘿嘿。
我是一顆剽悍的種子 把我會的,認真的分享 是我寫部落格一直不變的信條。
如果你能看到這篇博文,說明咱們還是很有緣的;希望能帶給你一些許幫助,創作的不易, 把我文章的知識帶走,你的三連留下,點贊,評論,關注,是我最大的動力。