从搜索的帖子来看,ABQ完全可以用双锁来实现,并且性能也得到了提升。
但是也有国外道友说:
因为ArrayBlockingQueue使用简单得多的数据结构来保存队列项。ArrayBlockingQueue将其数据存储在一个私有的final E []数组项中。为了使多个线程能够处理相同的存储空间,无论是添加还是出队,它们都必须使用相同的锁。 这不仅是因为内存屏障,还因为互斥保护,因为它们正在修改同一数组。 而LinkedBlockingQueue是队列元素的链表集合,它与ABQ完全不同,并具有双重锁定的能力。 队列中元素的内部存储启用了不同的锁配置。
性能上,双锁LBQ优越于单锁ABQ
LBQ的两把锁,分别控制出队和入队,所以,可以同时有两个线程进行操作链表,一进一出。
ABQ只有一把锁,所以,入队和出队同时只能发生一个。
我想大哥李就是因为考虑到两种数据结构实现的队列方式,所以,LBQ用两把锁,而ABQ用一把锁。
也可以由此推理出,数组用两把锁进行一进一出的操作时,会出现并发问题。
从国外道友的考虑方向看
ABQ用单锁的本质原因是实现队列的数据结构不同,它用数组实现队列的。
参考:https://blog.csdn.net/icepigeon314/article/details/93792519