JUC高并发容器

简介

高并发容器是java基于无锁编程实现的容器类,主要是使用cas自旋+volatile关键字组合实现.cas保证原子性,volatile来保证内存可见性.主要优点有:

1.开销较小:不需要在用户态和内核态之间进行转换.

2.读写互斥,只有写操作需要使用cas锁,读不需要.

CopyOnWriteArrayList

原理:

当多个线程去访问资源时,他们会获取到同一个指针指向的资源.当其中有线程修改时,会把数据复制出来一份,修改完后让指针指向修改后的资源.

add

使用

 public static void main(String[] args) {
        CopyOnWriteArrayList<Integer> objects = new CopyOnWriteArrayList<>();
        objects.add(11);
        objects.add(2);
        objects.add(13);
        objects.add(14);
        System.out.println(objects);
        System.out.println(objects.get(1));
    }

BlockingQuene

多用于线程间通信,比如:生产者-消费者模式.

主要方法

主要特征

原理

take()

put()

ArrayBlockingQuene

基于数组实现的队列,在添加和删除时不会产生额外的节点,相比更常用一些.

LinkedBlockingQuene

基于链表实现的堵塞队列,在添加和修改数据时,会产生额外的节点,但是添加和删除采用了独立的锁,并发性能更高一些.

默认情况下,新创建的LinkedBlockingQuene队列最大值是integer.max_value.

delayQuene

只有时间到了,才能从队列里面获取数据.没有最大限制,需要注意内存溢出.

PriorityBlockingQueue

带有优先级的队列.没有最大限制,需要注意内存溢出.

concurrentHashMap

1.7

数组+链表结构,使用了分段式锁.将key分为一个个segment,每个segment都有各自的锁.

1.8

数组+链表/红黑树结构.对map里面的锁进行了更细粒度的划分.将并发控制在了每一个桶.

其中Node的结构如图

put操作

Last updated

Was this helpful?