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

  • 相关阅读:
    Python【每日一问】38
    Python【每日一问】37
    Shell~echo -e 颜色输出
    Python【每日一问】36
    Python【每日一问】35
    聊聊、Java 命令 第二篇
    聊聊、RabbitMQ 配置文件
    聊聊、Java 命令 第一篇
    聊聊、CA机构认证CSR生成
    聊聊、Tomcat中文乱码和JVM设置
  • 原文地址:https://www.cnblogs.com/javabigdata/p/6994376.html
Copyright © 2011-2022 走看看