我需要具有线程安全的LIFO结构,并发现可以为此使用Deque的线程安全实现。 Java 7引入了 ConcurrentLinkedDeque ,而Java 6引入了 LinkedBlockingDeque

如果我只在LinkedBlockingDeque中使用非阻塞方法,例如addFirst()removeFirst(),它与ConcurrentLinkedDeque有什么区别吗?

也就是说,如果您忽略屏蔽方面,那么除了ConcurrentLinkedDeque受限制之外,LinkedBlockingDequeLinkedBlockingDeque之间还有其他区别吗?

最佳答案

两件事情:

1:如果我只在LinkedBlockingDeque中使用非阻塞方法,例如addFirst()removeFirst(),它与ConcurrentLinkedDeque有什么区别吗?

LinkedBlockingDeque中,这些方法在并发锁定行为方面确实有所不同:

public E removeFirst() {
        E x = pollFirst();
        ..
    }
 public E pollFirst() {
        lock.lock(); //Common lock for while list
        try {
            return unlinkFirst();
        } finally {
            lock.unlock();
        }
    }

对于addFirst方法也是如此。在ConcurrentLinkedDeque中,这两种方法的锁定行为是不同的,并且效率更高,因为它不会锁定整个列表,而是锁定列表的一部分,检查ConcurrentLinkedDeque的源将使您更加清楚。

2:来自ConcurrentLinkedDeque的javadoc:



以上对于LinkedBlockingDeque不正确

10-07 12:59