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培训班提供的学习大纲;

相关文章
相关标签/搜索