ArrayBlockingQueue源码
2021-08-18 10:02:46 5 举报
ArrayBlockingQueue
作者其他创作
大纲/内容
1
take
node线程1
while (count == 0)
firstWaiter
3
while (count == items.length)
notFull条件队列
注意:不能能并发put和take竞争的是同一把锁
将notFull条件队列中第一个节点移到AQS阻塞队列中,插入队尾,然后释放锁。线程的唤醒由阻塞队列的head节点唤醒它的下个节点
初始化 ArrayBlockingQueue queue=new ArrayBlockingQueue<>(2)lock = new ReentrantLock(false) notEmpty = lock.newCondition() notFull = lock.newCondition()
取出队列头部元素
lock.lockInterruptibly()
判断队列是否为空
nextWaiter
takeIndex
队列为空把当前线程放入notEmpty条件阻塞队列并挂起当前线程
notEmpty.await()
释放独占锁
4
lock.lockInterruptibly()
putIndex
dequeue
waitStatus
item数组
enqueue(x)入队后putIndex++
2
判断队列是否已满
已满将当前线程放入条件队列并挂起前线程
唤醒写线程操作的阻塞队列中第一个线程
notFull.signal()
notFull.await()
put(4)
结束
0 条评论
下一页