欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

java queue] 队列和 Deque 详细分析 -4. 疑惑,到底什么是阻塞队列?

最编程 2024-07-05 19:04:53
...

区分阻塞队列和非阻塞队列的关键因素是什么?

按照大多数文章的介绍,阻塞队列支持阻塞特性,在队列满或为空时会阻塞,但是我想到队列必须是线程安全的,阻塞队列(前文表格中的那5个阻塞队列)都是利用悲观加锁,互斥做到线程安全的,貌似加锁在某种程度上也等价于阻塞,巧合的是非阻塞队列(比如ConcurrentLinkedQueue)又是利用乐观锁实现线程安全的,乐观锁可以理解成未加锁。

在《JAVA中的阻塞队列和非阻塞队列》一文中,介绍非阻塞队列时有如下:

基于锁的算法会带来一些活跃度失败的风险。如果线程在持有锁的时候因为阻塞I/O、页面错误、或其他原因发生延迟,很可能所有的线程都不能工作了。一个线程的失败或挂起不应该影响其他线程的失败或挂起,这样的算法称为非阻塞算法;如果算法的每一个步骤中都有一些线程能够继续执行,那么这样的算法称为锁*(lock-free)算法。在线程间使用CAS进行协调,这样的算法如果能构建正确的话,它既是非阻塞的,又是锁*的。java中提供了基于CAS非阻塞算法实现的队列,比较有代表性的有ConcurrentLinkedQueueLinkedTransferQueue,它们的性能一般比阻塞队列的好。

那么如果回答什么是阻塞队列,什么是非阻塞队列时,是不是2个要素都要提及?

4.1 答案

阻塞队列,是指多线程访问竞争资源时,当竞争资源已被某线程获取时,其它要获取该资源的线程需要阻塞等待!

虽然队列满了,会休眠,出队发现为空,就等待,也是阻塞,但不是阻塞队列的核心概念!

参见 《JUC回顾之-ArrayBlockingQueue底层实现和原理》


参考:
https://www.cnblogs.com/bjxq-cs88/p/9759571.html 什么是阻塞队列?
https://www.cnblogs.com/lemon-flm/p/7877898.html
https://baijiahao.baidu.com/s?id=1649350860832492296&wfr=spider&for=pc

推荐阅读