• java多线程系列12 ConcurrentHashMap CopyOnWriteArrayList 简介


    我们知道 hashmap 和 arraylist 是线程不安全的

    在多线程环境下有数据安全问题,

    当然 我们可以通过Collections的一些方法把他们变成线程安全的,          

             Collections.synchronizedList(list)

    Collections.synchronizedMap(m)

    也可以使用Hashtable  vector  但是这样子做,性能不太好。

    今天主要说的是juc包的并发容器类,使用跟hashmap 和 arraylist 都是一样的,这里不再详述

    主要简述下原理

    ConcurrentHashMap

    一个ConcurrentHashMap由多个segment【默认16个组成,每一个segment都包含了一个HashEntry数组的hashtable, 每一个segment包含了对自己的hashtable的操作,比如get,put,replace等操作,这些操作发生的时候,对自己的hashtable进行锁定。由于每一个segment写操作只锁定自己的hashtable,所以可能存在多个线程同时写的情况,性能无疑好于只有一个hashtable锁定的情况

    CopyOnWriteArrayList【读写分离的的思想】

       public boolean add(E e) {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                Object[] elements = getArray();
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len + 1);
                newElements[len] = e;//在新数组上加入新元素
                setArray(newElements);//更新原来的数组
                return true;
            } finally {
                lock.unlock();
            }
    }

    public E get(int index) { return get(getArray(), index); //在原来的数组上读取数据 }

      

    总结:CopyOnWriteArrayList 适合读远远大于写的情况,b毕竟 写的时候会复制整个数组,当数据量比较大的时候耗资源

  • 相关阅读:
    BZOJ1787 [Ahoi2008]Meet 紧急集合[结论题]
    poj3728 The merchant[倍增]
    poj2750 Potted Flower[线段树]
    poj2482 Stars in Your Window[扫描线]
    poj2182 Lost Cows[BIT二分]
    UVA12096 The SetStack Computer
    第05组(65) 需求分析报告
    团队介绍与选题报告
    数据采集技术第三次作业
    结对编程作业
  • 原文地址:https://www.cnblogs.com/javabigdata/p/6994376.html
Copyright © 2020-2023  润新知