我正在查看ArrayBlockingQueue和LinkedBlockingQueue的源代码。LinkedBlockingQueue针对插入和删除分别使用putLock和takeLock,但是ArrayBlockingQueue只使用一个锁。我认为LinkedBlockingQueue是基于Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms中描述的设计实现的。在这篇论文中,他们提到保留虚拟节点,以便enqueuers永远不必访问head,dequeuers永远不必访问tail,从而避免死锁情况。我想知道为什么ArrayBlockingQueue不借鉴同样的想法,使用2个锁。