Java源码解读系列8—ArrayBlockingQueue(JDK1.8 )

1 概述

ArrayBlockingQueue(简称ABQ)是BlockingQueue接口的实现类,是一种有界界、阻塞、线程安全的FIFO队列。ABQ底层存储基于数组,因此需要在初始化时候指定数组容量。相对基于链表实现的阻塞队列LinkedBlockingQueue(简称LBQ),ABQ队列中元素的入队和出队都是使用同一把锁来保证线程安全,实现更加简单。

2 构造函数

//capacity是数组容量
public ArrayBlockingQueue(int capacity) {
   
       //默认是使用非公平锁
        this(capacity, false);
}
    
public ArrayBlockingQueue(int capacity, boolean fair) {
   
   //初始容量必须大于0
     if (capacity <= 0)
         throw new IllegalArgumentException();
     //items为全局变量,表示存储元素的数组
     this.items = new Object[capacity];
     //fail位true表示公平锁;false表示非公平锁
     lock = new ReentrantLock(fair);
     //取出的对象监听器
     notEmpty = lock.newCondition();
     //添加的对象监听器
     notFull =  lock.newCondition();
 }

3 阻塞式新增操作(put方法)

public void put(E e) throws InterruptedException {
   
       //非空检查
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        //上锁
        //响应中断
        lock.lockInterruptibly();
        try {
   
           //count为全局变量,表示数组中存储元素的真实数量
           //count==items.length,说明数组已满,线程进入阻塞状态
            while (count == items.length)
               //线程阻塞,释放锁
               //线程被唤醒后,会重新获得锁
                notFull.await();
             //count!=items.length,说明数组未满,可以继续添加到队列中
            enqueue(e);
        } finally {
   
             //释放锁
            lock.unlock();
        }
    }
    
    
private void enqueue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值