4.3.4并发容器类list_set_queue

list

ArrayList

默认长度为0, 第一次去add元素的时候数组长度为10(DEFAULT_CAPACITY=10), 当添加到第11个元素的时候会自动扩容 1.5*capacity

在循环中对list做add和remove操作就会报并发异常(modcount 字段的作用), 线程不安全.
在这里插入图片描述

LinkedList

CopyOnWriteArrayList

写的时候复制一份,读仍然用前面的array, 写完后将指针指向另外一个即可.
在这里插入图片描述

对写加锁
在这里插入图片描述

Set 集合

TreeSet 是红黑树实现的线程不安全
ConcurrentSkipListSet 是skip list实现的并且线程安全.
在这里插入图片描述

Queue API

在这里插入图片描述

ArrayBlockingQueue

一把锁, put和take采用ReentryLock的condition.

LinkedBlockingQueue

两把锁, put和take分别在尾部和头部有不同的锁, 性能更高.

ConcurrentLinkedQueue

没有阻塞的两个api, 使用的cas模式, 效率更高, 因为这个地方没有业务逻辑仅仅是出队列 与 近队列.

SynchronousQueue

同步队列是没有容量的队列, take会阻塞,直到有元素, put时会阻塞直到被get . 缓存线程池中有用到

PriorityBlockingQueue

按照数据的顺序来出队列, 可以指定优先级 通过传入comarator接口实现,

package com.study.list_set_queue.queue;

import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;

public class Demo4_PriorityBlockingQueue3 {
    public static void main(String args[]){
        PriorityBlockingQueue<Student> queue = new PriorityBlockingQueue<>(5, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                int num1 = o1.age;
                int num2 = o2.age;

                if (num1 > num2)
                    return 1;
                else if (num1 == num2)
                    return 0;
                else
                    return -1;
            }
        });
        queue.put(new Student(10, "enmily"));
        queue.put(new Student(20, "Tony"));
        queue.put(new Student(5, "baby"));

        for (;queue.size() >0;){
            try {
                System.out.println(queue.take().name);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Student{
    public int age;
    public String name;

    public Student(int age, String name){
        this.age = age;
        this.name = name;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值