最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Java并發(fā)編程之set集合的線程安全類你知道嗎

標(biāo)簽:
Java

Java并发编程之-set集合的线程安全类

Java中set集合怎么保证线程安全,这种方式你知道吗?

在Java中set集合是

本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《并发集合系列》教程的第二篇:

本文主要内容:Set集合子类底层分别是什么?基于底层为什么set的子类可以存放一个数据?怎么解决set线程安全问题?

一:Set集合子类

Set的三个子类分别是:HaseSet、TreeSet、LinkedHashSet.这三个都是线程不安全的。那么这三个子类的底层是什么?

二:三个子类底层

1:haseSet的底层其实是hashMap

https://img1.sycdn.imooc.com//5e8004630001092b08780464.jpg

2:treeSet的底层其实就是一个TreeMap

https://img1.sycdn.imooc.com//5e8004640001f9e004810383.jpg

3:linkedHashSet底层LinkedHashMap

https://img1.sycdn.imooc.com//5e80046400013e9c07980121.jpg

三:set添加的时候只有一个参数怎么做到的?

通过上面我们可以看出,set三个子类的底层其实都是Map的。我们也知道Map是key-value键值对出现的。我们也知道,set添加方法是set.add(“司小司”)。参数只有一个,不是键值对的,那么底层Map怎么存储的呢?

我们来add方法的源码是怎么实现的吧:

https://img1.sycdn.imooc.com//5e8004640001f7c809070435.jpg

从源码中,我们可以看到,把传递的参数作为key处理的。那么,value又是什么呢?

PRESENT是什么呢?

https://img1.sycdn.imooc.com//5e8004650001045a09600161.jpg

其实就是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包下相关的类创建。如下图:

https://img1.sycdn.imooc.com//5e8004650001b8b509530241.jpg


點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消