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毕竟 写的时候会复制整个数组,当数据量比较大的时候耗资源

 

posted on 2017-06-12 18:25  一只小蜗牛12138  阅读(164)  评论(0编辑  收藏  举报

导航