【JAVA】阻塞队列如何实现?分析JDK 阻塞队列源码实现

阻塞队列,顾名思义,在队列操作时有阻塞机制,防止出现数据不一致,这里只分析两个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、生产和消费完判断队列元素个数,唤醒对应的生产消费线程

发布了223 篇原创文章 · 获赞 208 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/chiweitree/article/details/90437848