1. 程式人生 > >Java併發程式設計之set集合的執行緒安全類你知道嗎

Java併發程式設計之set集合的執行緒安全類你知道嗎

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包下相關的類建立。如下圖:

&n