LinkedBlockingQueue队列

概述

LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素。添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行。LinkedBlockingQueue采用可重入锁(ReentrantLock)来保证在并发情况下的线程安全。

实现原理

1、属性

在这里插入图片描述
在这里插入图片描述
LinkedBlockingQueue的每个节点元素都是通过Node进行存储的,通过head表示头节点,last代表尾部节点。

2、构造器
    public LinkedBlockingQueue() {
        this(Integer.MAX_VALUE);
    }

    public LinkedBlockingQueue(int capacity) {
        if (capacity <= 0) throw new IllegalArgumentException();
        this.capacity = capacity;
        last = head = new Node<E>(null);
    }

    public LinkedBlockingQueue(Collection<? extends E> c) {
        this(Integer.MAX_VALUE);
        final ReentrantLock putLock = this.putLock;
        putLock.lock(); // Never contended, but necessary for visibility
        try {
            int n = 0;
            for (E e : c) {
                if (e == null)
                    throw new NullPointerException();
                if (n == capacity)
                    throw new IllegalStateException("Queue full");
                enqueue(new Node<E>(e));
                ++n;
            }
            count.set(n);
        } finally {
            putLock.unlock();
        }
    }

LinkedBlockingQueue的三个构造方法
第一个,如果不指定大小的话,会创建一个默认大小为Integer.MAX_VALUE的队列,此队列如果在高并发的情况下,入队列的数据比出队列的数据多的时候,就会出内存溢出的情况
第二个,可以指定一个固定大小的队列,别切同时会创建 Node为空的头节点和尾部节点。
第三个,也是创建一个默认大小为Integer.MAX_VALUE的队列。循环将集合中的元素添加至队列中

3、核心方法
public interface BlockingQueue<E> extends Queue<E> {
	// 将给定元素设置到队列中,如果设置成功返回true, 否则返回false。
	// 如果是往限定了长度的队列中设置值,推荐使用offer()方法。
    boolean add(E var1);
    
	// 将给定的元素设置到队列中,如果设置成功返回true, 否则返回false. e的值不能为空,
	// 否则抛出空指针异常。
    boolean offer(E var1);

	// 将元素设置到队列中,如果队列中没有多余的空间,该方法会一直阻塞,
	// 直到队列中有多余的空间。
    void put(E var1) throws InterruptedException;

	// 将给定元素在给定的时间内设置到队列中,如果设置成功返回true, 否则返回false.
    boolean offer(E var1, long var2, TimeUnit var4) throws InterruptedException;

	// 从队列中获取值,如果队列中没有值,线程会一直阻塞,
	// 直到队列中有值,并且该方法取得了该值。
    E take() throws InterruptedException;

	// 在给定的时间里,从队列中获取值,时间到了直接调用普通的poll方法,
	// 为null则直接返回null。
    E poll(long var1, TimeUnit var3) throws InterruptedException;

	// 获取队列中剩余的空间。
    int remainingCapacity();

	// 从队列中移除指定的值。
    boolean remove(Object var1);

	// 判断队列中是否拥有该值。
    boolean contains(Object var1);

	// 将队列中值,全部移除,并发设置到给定的集合中
    int drainTo(Collection<? super E> var1);

	// 指定最多数量限制将队列中值,全部移除,并发设置到给定的集合中。
    int drainTo(Collection<? super E> var1, int var2);
}

可重入锁

https://blog.csdn.net/csndhu/article/details/101023818

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值