简介
LinkedBlockingQueue 底层结构为单项链表,拥有两把锁 takeLock 和 putLock, 以及对应的两个Condition,notEmpty 和 notFull, 维护了两个引用,分别指向链表的首尾,其中head 为 空值节点
我们先看下put 1562821538(1).jpg在进行put操作时,会先对put加锁,保证同一时刻只有一个线程可以执行put, 当队列已满时,notFull等待,
当被唤醒时,重新检查条件,成功则执行入队,同时如果队列尚未满,则会再次signal notFull,让别的阻塞在put上的线程有机会执行put,最后,若该线程认为队列有空变为非空(c ==0), 则会signal notEmpty
对于take则类似
1562822077(1).jpg
总结
与ArrayBlockingQueue相比,LinkedBlockingQueue 维护了两把锁,对put 和 take 分别维护了一把锁,所以在
LinkedBlockingQueue ,出入队是可以同时进行的,所以适用于需要频繁的执行生产 消费的场景,而ArrayBlockingQueue只有一把锁,同一时刻put take 只能有一个进行,效率会低一些
网友评论