Java併發編程之set集合的線程安全類

Java併發編程之-set集合的線程安全類java

Java中set集合怎麼保證線程安全,這種方式你知道嗎?編程

在Java中set集合是安全

本篇是《凱哥(凱哥Java:kagejava)併發編程學習》系列之《併發集合系列》教程的第二篇:併發

本文主要內容:Set集合子類底層分別是什麼?基於底層爲何set的子類能夠存放一個數據?怎麼解決set線程安全問題?ide

一:Set集合子類

Set的三個子類分別是:HaseSet、TreeSet、LinkedHashSet.這三個都是線程不安全的。那麼這三個子類的底層是什麼?工具

二:三個子類底層

1:haseSet的底層實際上是hashMap學習

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

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

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

3:linkedHashSet底層LinkedHashMap對象

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

三:set添加的時候只有一個參數怎麼作到的?

經過上面咱們能夠看出,set三個子類的底層其實都是Map的。咱們也知道Map是key-value鍵值對出現的。咱們也知道,set添加方法是set.add(「司小司」)。參數只有一個,不是鍵值對的,那麼底層Map怎麼存儲的呢?blog

咱們來add方法的源碼是怎麼實現的吧:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

從源碼中,咱們能夠看到,把傳遞的參數做爲key處理的。那麼,value又是什麼呢?

PRESENT是什麼呢?

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

其實就是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包下相關的類建立。以下圖:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

 想要學習Java開發的同窗,能夠參考成都Java培訓班提供的學習大綱;

相關文章
相關標籤/搜索