Java並發編程之-set集合的線程安全類
Java中set集合怎么保證線程安全,這種方式你知道嗎?
在Java中set集合是
本篇是《凱哥(凱哥Java:kagejava)並發編程學習》系列之《並發集合系列》教程的第二篇:
本文主要內容:Set集合子類底層分別是什么?基於底層為什么set的子類可以存放一個數據?怎么解決set線程安全問題?
一:Set集合子類
Set的三個子類分別是:HaseSet、TreeSet、LinkedHashSet.這三個都是線程不安全的。那么這三個子類的底層是什么?
二:三個子類底層
1:haseSet的底層其實是hashMap

2:treeSet的底層其實就是一個TreeMap

3:linkedHashSet底層LinkedHashMap

三:set添加的時候只有一個參數怎么做到的?
通過上面我們可以看出,set三個子類的底層其實都是Map的。我們也知道Map是key-value鍵值對出現的。我們也知道,set添加方法是set.add(“司小司”)。參數只有一個,不是鍵值對的,那么底層Map怎么存儲的呢?
我們來add方法的源碼是怎么實現的吧:

從源碼中,我們可以看到,把傳遞的參數作為key處理的。那么,value又是什么呢?
PRESENT是什么呢?

其實就是new了個object對象。
問題來了:set為什么不能不能存放重復值,而list就可以了呢?
從上面add的源碼中,我們可以看出,add的數據是作為map的key來存放的。在Map中,Key是不能重復的。所以,set里面的數據不能有重復的。
四:Set集合怎么實現線程安全?
方案一:
和list一樣,使用Colletcions這個工具類syn方法類創建個線程安全的set.
Set<String> synSet = Collections.synchronizedSet(new HashSet<>());
方案二:
使用JUC包里面的CopyOnWriteArraySet
Set<String> copySet = new CopyOnWriteArraySet<>();
總結:
創建set有五種方法,其中通過三個子類直接創建出來的是線程不安全的。想要創建線程安全的set可以通過工具類或者是juc包下相關的類創建。如下圖:


