首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentLinkedDeque对LinkedBlockingDeque

ConcurrentLinkedDeque对LinkedBlockingDeque
EN

Stack Overflow用户
提问于 2013-10-04 10:29:07
回答 4查看 18K关注 0票数 19

我需要一个线程安全的LIFO结构,并发现我可以为此使用Deque的线程安全实现。Java7引入了ConcurrentLinkedDeque,Java6引入了LinkedBlockingDeque

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

也就是说,如果您忽略阻塞方面,ConcurrentLinkedDequeLinkedBlockingDeque除了LinkedBlockingDeque是有界的之外,还有其他的区别吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-04 11:28:45

有两件事:

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

LinkedBlockingDeque中,这些方法在并发锁定行为方面确实存在差异。

代码语言:javascript
复制
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的

注意,与大多数集合不同,size方法不是一个固定时间的操作。 。。 此外,批量操作( addAll、removeAll、retainAll、containsAll、equals和toArray )不能保证以原子方式执行。

以上不适用于LinkedBlockingDeque

票数 9
EN

Stack Overflow用户

发布于 2013-10-04 11:24:02

引用伟大的道格·利亚 (我的重点)

LinkedBlockingDeque对ConcurrentLinkedDeque -- LinkedBlockingDeque类旨在成为“标准”阻塞deque类。当前的实现具有相对较低的开销,但可伸缩性相对较差的。..。 . ConcurrentLinkedDeque具有与LinkedBlockingDeque几乎相反的性能配置文件:相对较高的开销,但非常好的可伸缩性。..。在并发应用程序中,需要线程安全但不支持阻塞的Deque并不是很常见。而大多数这样做的人可能更适合用特殊情况的解决方案。

他似乎在建议您应该使用LinkedBlockingDeque,除非您特别需要ConcurrentLinkedDeque的特性。

票数 16
EN

Stack Overflow用户

发布于 2013-10-04 11:21:03

ConcurentLinkedDequeue是无锁的(请参阅源代码中的注释),而LinkedBlockingQueue使用锁定。也就是说前者应该更有效率。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19179046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档