您当前的位置: 首页 >  ar

恐龙弟旺仔

暂无认证

  • 0浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK源码解析之ArrayBlockingQueue

恐龙弟旺仔 发布时间:2019-01-08 16:30:59 ,浏览量:0

前言:

    之前介绍的关于Queue的实现类,LinkedList、PriorityQueue都是非线程安全的队列,那么有没有线程安全的Queue实现类呢?

    当然是有的,在java.util.concurrent中有几个关于Queue的线程安全实现

/**
 * @see java.util.concurrent.ArrayBlockingQueue
 * @see java.util.concurrent.LinkedBlockingQueue
 * @see java.util.concurrent.PriorityBlockingQueue
 */

    由名称可以看出来,ArrayBlockingQueue是基于数组实现的;LinkedBlockingQueue是基于链表实现的;PriorityBlockingQueue是基于堆实现的优先级队列    

    实现方式都是差不多的,只是底层结构不一样,之前的几篇博客已经分析过这些数据结构的不同了,在这里就不再继续分析了,焦点就关注在如何实现线程安全。

    本篇博客来分析一下比较典型的ArrayBlockingQueue

 

1.ArrayBlockingQueue结构分析
/**
 * A bounded {@linkplain BlockingQueue blocking queue} backed by an
 * array.  This queue orders elements FIFO (first-in-first-out).
 */
public class ArrayBlockingQueue extends AbstractQueue
        implements BlockingQueue, java.io.Serializable {
        
    // 基于数组存储
    /** The queued items */
    final Object[] items;
    
    // 下一个获取值的索引
    /** items index for next take, poll, peek or remove */
    int takeIndex;
    
    // 下一个存放值的索引
    /** items index for next put, offer, or add */
    int putIndex;
    
    // 队列中元素数量
    /** Number of elements in the queue */
    int count;
    
    // 锁
    /** Main lock guarding all access */
    final ReentrantLock lock;

    // 锁的条件队列(非空,如果队列已空,则再执行删除元素的是会在此等待)
    /** Condition for waiting takes */
    private final Condition notEmpty;

    // 锁的条件队列(未满,如果队列已满,则再执行添加元素的是会在此等待)
    /** Condition for waiting puts */
    private final Condition notFull;

    笔者把对应的英文注释也拷贝过来了,实际直接看英文注释基本就已经理解了相关成员变量的含义了

 

2.构造方法
// 1.指定容量构造
public ArrayBlockingQueue(int capacity) {
    this(capacity, false);
}

// 2.指定容量和锁的类型
public ArrayBlockingQueue(int capacity, boolean fair) {
    if (capacity             
关注
打赏
1655041699
查看更多评论
0.0408s