Java阻塞队列LinkedBlockingQueue原理分析

341 阅读1分钟

书接前文 Java阻塞队列ArrayBlockingQueue原理分析 分析完了ArrayBlockingQueue再看LinkedBolckQueue就很容易理解了,相同的思路,只不过两种实现方式。一个用数组处理,一个用链表处理。 这里不再着重讲源码了,只说下跟arrayBlcokingQueue的不同。

    //记录队列有效个数,这里用AtomicInteger的自增或者自减
    private final AtomicInteger count = new AtomicInteger();

    //节点头,出队列地址
    transient Node<E> head;

    //尾节点,添加元素在尾节点加入
    private transient Node<E> last;

    //这里出队列和入队列使用了两把锁,出入分离
    private final ReentrantLock takeLock = new ReentrantLock();

    /** Wait queue for waiting takes */
    private final Condition notEmpty = takeLock.newCondition();

    /** Lock held by put, offer, etc */
    private final ReentrantLock putLock = new ReentrantLock();

    /** Wait queue for waiting puts */
    private final Condition notFull = putLock.newCondition();

LinkedBlockingQueue count计数使用了AtomicInteger,因为出入队列使用的是两把不同的锁,都要操作count,这样保证了count的线程安全性。