zoukankan      html  css  js  c++  java
  • 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包下相关的类创建。如下图:

  • 相关阅读:
    ChartCtrl源码剖析之——CChartTitle类
    ChartCtrl源码剖析之——CChartObject类
    如何在BCGControlBar工程的工具栏里面新增下拉列表控件
    如何在BCGControlBar界面库的CBCGPFormView子视图里面添加工具栏
    记一次调试串口设备Bug的经历
    复数学习笔记
    2021 新高考Ⅰ卷数学试卷及答案
    博客搬家了
    塔伯自我指涉由图片生成K值python程序
    塔伯自我指涉公式作图程序(matplotlib)
  • 原文地址:https://www.cnblogs.com/kaigejava/p/12591028.html
Copyright © 2011-2022 走看看