• 集合框架的线程安全问题ArrayList、HashSet、HashMap


    集合框架的线程安全问题

     ArrayListLinkedList,HashSet,HashMap等等,它们都是线程不安全的。因此在高并发的场景下不能使用。应该使用它们对应的并发版本

    • CopyOnWriteArrayList 是对应ArrayList的并发版本
    • CopyOnWriteArraySet是对应HashSet的并发版本
    • ConcurrentHashMap是对应HashMap的并发版本
    • 使用起来非常耗时

    ArrayList和CopyOnWriteArrayList

    public class TestCollection {
        public static void main(String[] args) {
            arryTocon arryTocon = new arryTocon();
            arryTocon.start();
            for (int i = 0; i < 100_0000 ; i++) {
                arryTocon.list.add(i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());
        }
    }
    class arryTocon extends Thread{
        List<Integer> list = new ArrayList<>();
        @Override
        public void run() {
    
            for (int i = 0; i < 100_0000 ; i++) {
                list.add(i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    使用ArrayList

    运行结果很明显可与看到有线程安全问题

    Thread-0list 元素的数量1647242
    mainlist 元素的数量1926604
    
    • 1
    • 2
    使用CopyOnWriteArrayList
       List<Integer> list = new ArrayList<>();
    
    • 1

    CopyOnWriteArrayList 解决了线程安全问题

    Thread-0list 元素的数量18384
    mainlist 元素的数量20000
    
    • 1
    • 2

    HashSet和CopyOnWriteArraySet

    public class TestCollection {
        public static void main(String[] args) {
            arryTocon arryTocon = new arryTocon();
            arryTocon.start();
            for (int i = 0; i < 100_0000 ; i++) {
                arryTocon.list.add(i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());
        }
    }
    
    class arryTocon extends Thread{
        CopyOnWriteArraySet<Integer> list = new CopyOnWriteArraySet<Integer>();
        @Override
        public void run() {
            for (int i = 0; i < 100_0000 ; i++) {
                list.add(i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    使用HashSet
    mainlist 元素的数量1343415
    Thread-0 list 元素的数量1343415
    
    • 1
    • 2
    使用CopyOnWriteArraySet
    mainlist 元素的数量1000000
    Thread-0 list 元素的数量1000000
    
    • 1
    • 2

    ConcurrentHashMap是对应HashMap的并发版本

    public class TestCollection {
        public static void main(String[] args) {
            arryTocon arryTocon = new arryTocon();
            arryTocon.start();
            for (int i = 0; i < 1_0000 ; i++) {
                arryTocon.list.put(i,i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + arryTocon.list.size());
        }
    }
    class arryTocon extends Thread{
        ConcurrentHashMap list = new ConcurrentHashMap();
        @Override
        public void run() {
    
            for (int i = 0; i < 1_0000 ; i++) {
                list.put(i,i);
            }
            System.out.println(Thread.currentThread().getName() + "list 元素的数量" + list.size());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    使用HashMap
    mainlist 元素的数量1146060
    Thread-0list 元素的数量1146060
    
    • 1
    • 2
    使用ConcurrentHashMap
    mainlist 元素的数量10000
    Thread-0list 元素的数量10000
    
    • 1
    • 2
  • 相关阅读:
    【国际化多语言方案】i18n / class google sheets v4 api 在线文档同步json
    返回Series或DataFrame中指定列中指定数量的最小值nsmallest()函数
    小白也可以玩转CMake之常用必备
    十七、CANdelaStudio深入-创建新工程
    Mysql数据库管理员入门指南
    详解OpneCV的按键值获取函数waitKey()及使用中需要注意的地方
    【Flowable】Springboot使用Flowable(一)
    ABP微服务系列学习-对接Apollo配置中心
    CMake----编译构建开源工具软件,zlib、quazip
    领英如何不让对方查看自己的好友
  • 原文地址:https://blog.csdn.net/weixin_58286934/article/details/128175100