JDK并发数据结构

作者: 城市里永远的学习者 | 来源:发表于2018-09-28 15:48 被阅读0次

一、并发list
Vector和CopyOnWriteArrayList是两个线程安全的list,如果在多线程环境中使用ArrayList则使用Collections.synchronizedList(List list)进行包装。但两者实现的机制不同:
Vector的get和add/remove等操作都是采用synhronized同步方法,都需要获得对象锁,并发时会影响性能
代码块:

/*get 采用同步方法*/
public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }
/*set采用同步方法*/
 public synchronized E set(int index, E element) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

CopyOnWriteArrayList利用了对象的不变性,读操作时没有加锁,在试图改变对象时,总是先获得对象的副本,然后对副本进行修改,最后将副本写回,写操作时用的重入锁
代码块:

/*get方法*/
private E get(Object[] a, int index) {
        return (E) a[index];
    }
/*set方法采用ReentrantLock锁*/
 public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len);
                newElements[index] = element;
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

对比:1.读操作时,CopyOnWriteArrayList更快 2.写操作时,Vector会比起快,CopyOnWriteArrayList首先申请了锁,同时还要进行对象副本复制

二、并发set
与list类似,set也有一个CopyOnWriteArraySet,实现set接口,也是线程安全的。适合读多写少的高并发场景,高并发写场景使用Collections 的方法:
public static <T> Set<T> synchronizedSet(Set<T> s) 得到一个线程安全的set

三、并发map
多线程环境一般使用Collections.synchronizedMap()得到一个线程安全的map,但在高并发情况,使用java.concurrent包中的ConcurrentMap的子类ConcurrentHashMap,其get方法是无锁的,put等操作采用分段锁机制,从而提高其操作性能,而hashMap则是非线程安全的

四、并发queue
两种:BlockingQueue(以此为接口的阻塞队列)和ConcurrentLinkedQueue(高性能队列),但都继承自queue。
高并发场景下使用ConcurrentLinkedQueue队列,而BlockingQueue用于简化线程间的数据共享

五、并发deque
并发双堆队列

相关文章

  • Java性能优化二:并发程序设计优化,开发必备优化技巧!

    一、JDK 并发数据结构: 1、并发 List : Vector 或者 CopyOnWriteArrayList ...

  • Jctools Queue队列

    JCTools是一款对jdk并发数据结构进行增强的并发工具,主要提供了非阻塞Map以及无锁Queue的增强数据结构...

  • JDK并发数据结构

    一、并发listVector和CopyOnWriteArrayList是两个线程安全的list,如果在多线程环境中...

  • ConcurrentHashMap源码剖析

    1.JDK1.7 数据结构: 分为两级数组,外面有一个Segment数组,大小与并发级别有关 每个Segment管...

  • JDK并发包-JDK并发容器

    除了同步控制,线程池等基本工具以外,JDK还准备了一大批好用的容器类。 1.1 并发集合 JDK提供的这些容器大部...

  • java并发-并发容器

    jdk并发容器 并发集合 JDK提供的这些容器大部分在java.util.concurrent包中。 Concur...

  • List容量及扩容

    JDK1.7 JDK1.8 ArrayList (jdk1.7、jdk1.8) 数据结构 默认容量 扩容 Vect...

  • ConcurrencyMap

    ConcurrencyMap 从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器。 在JDK ...

  • 刷完HashMap源码,我们一起进大厂

    不可不知的哈希映射 2.1 HashMap数据结构 目标: HashMap 概念、数据结构回顾(JDK8和JDK7...

  • HashMap

    元素存储: HashMap的数据结构: JDK1.7中是数组+ 单链表的数据结构。JDK1.8及之后是数组+链表+...

网友评论

    本文标题:JDK并发数据结构

    本文链接:https://www.haomeiwen.com/subject/pqlpoftx.html