日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解HashSet并發修改異常

作者:wu1308156206 更新時間: 2022-07-10 編程語言
  1. HashSet和ArrayList一樣,是非線程安全的

    public class SetTest {
        public static void main(String[] args) {
            Set<String> set = new HashSet<>();
    
            for (int i = 0; i < 20; i++) {
                new Thread(()->{
                    set.add(UUID.randomUUID().toString().substring(0,5));
                    System.out.println(set);
                }).start();
            }
        }
    }
    

    上面代碼會出現并發異常

在這里插入圖片描述

解決方法:

  • 使用Collections工具類

    Set<String> set = Collections.synchronizedSet(new HashSet<>());
    
  • 使用CopyOnWriteArraySet

    Set<String> set = new CopyOnWriteArraySet<>();
    
  1. 關于HashSet

    HashSet是一個不重復的集合,本質上是一個HashMap,基于HashMap中 key不重復的原理

    //創建了一個HashMap對象
    public HashSet() {
        map = new HashMap<>();
    }
    
    //add方法就是向map中put值
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
    
    //PRESENT 是一個常量對象
    private static final Object PRESENT = new Object();
    

原文鏈接:https://blog.csdn.net/wu1308156206/article/details/125688750

欄目分類
最近更新