zoukankan      html  css  js  c++  java
  • 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毕竟 写的时候会复制整个数组,当数据量比较大的时候耗资源

  • 相关阅读:
    洛谷P2146 [NOI2015]软件包管理器
    洛谷P3038 [USACO11DEC]牧草种植Grass Planting
    洛谷P2831 愤怒的小鸟
    洛谷P1084 疫情控制
    洛谷P3258 [JLOI]2014松鼠的新家
    洛谷P1084 运输计划
    洛谷P2051 [AHOI2009]中国象棋
    洛谷P1438 无聊的数列
    洛谷P1312 Mayan游戏
    luogu P1038 神经网络
  • 原文地址:https://www.cnblogs.com/javabigdata/p/6994376.html
Copyright © 2011-2022 走看看