HashSet不安全 HashSet也是線程不安全的,底層沒有進行任何線程同步處理。
在hashset的源碼中,底層是用hashmap實現的:
每次add的時候,把值放在了map對象中的key,而map對象的value則全部統一放一個常量:
在下面的demo中,hashset在多線程情況下和arrayList一樣會拋出java.util.ConcurrentModificationException
/**
- @author zkw
- @Description HashSet不安全 */ public class ThreadHashSet { public static void main(String[] args) { Set list = new HashSet<>(); for (int i = 0; i < 30; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); }, i+"").start(); } } } 一鍵獲取完整項目代碼 java
解決方法 使用 CopyOnWriteArraySet
public class ThreadHashSet { public static void main(String[] args) { Set list = new CopyOnWriteArraySet<>(); for (int i = 0; i < 30; i++) { new Thread(()->{ list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); }, i+"").start(); } } } 一鍵獲取完整項目代碼 java
HashMap不安全 使用HashMap空參構造,其初始容量是16,負載因子0.75
初始容量和負載因子都可以自定義,構造方法如下:
HashMap同上面兩個類一樣,在多線程情況下會出現併發修改異常java.util.ConcurrentModificationException
解決方法:使用ConcurrentHashMap
public static void main(String[] args) { Map<String,String> list = new ConcurrentHashMap<>(); for (int i = 0; i < 30; i++) { new Thread(()->{ list.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,8)); System.out.println(list); }, i+"").start(); }
———————————————— 版權聲明:本文為CSDN博主「向着五星的方向」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/qq_69748833/article/details/137092738