我需要具有线程安全的LIFO结构,并发现可以为此使用Deque
的线程安全实现。 Java 7引入了 ConcurrentLinkedDeque
,而Java 6引入了 LinkedBlockingDeque
。
如果我只在LinkedBlockingDeque
中使用非阻塞方法,例如addFirst()
和removeFirst()
,它与ConcurrentLinkedDeque
有什么区别吗?
也就是说,如果您忽略屏蔽方面,那么除了ConcurrentLinkedDeque
受限制之外,LinkedBlockingDeque
和LinkedBlockingDeque
之间还有其他区别吗?
最佳答案
两件事情:
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
不正确