阻塞队列,顾名思义,在队列操作时有阻塞机制,防止出现数据不一致,这里只分析两个API的操作源代码
offer(E e)
生产者,生产元素
1、加锁,ReentrantLock
加锁保证了不会同时有多个生产者来生产元素,达到阻塞,否则数据错误乱
2、判断当前队列里的元素数count,和队列容量capacity比较
判断是否可以往里面生产元素
3、数据入队
4、计数器++
5、没满,唤醒notFull阻塞线程,可以继续放元素了
6、释放lock,其它线程可以继续调用offer了
7、唤醒notEmpty阻塞线程,消费元素线程
count==0的条件判断做了一个严格校验,防止元素空浪费一次唤醒操作
take()
1、加锁,takeLock,消费锁
2、计数器为0,说明队列空,notEmpty阻塞所有的消费操作
3、消费元素,计数器--
4、计数器判断还有元素,notEmpty唤醒所有消费操作
5、释放锁,takeLock
6、消费的时候,生产操作一直在进行
判断是否达到容量上限边界,等于容量,还可以继续生产,唤醒生产线程
阻塞队列实现步骤:
1、生产消费同步加锁,进行阻塞
2、生产和消费完判断队列元素个数,唤醒对应的生产消费线程