19

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

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

即,如果您忽略阻塞方面,除了有界之外, ConcurrentLinkedDequeand之间还有其他区别吗?LinkedBlockingDequeLinkedBlockingDeque

4

4 回答 4

16

引用伟大的Doug Lea(我的重点)

LinkedBlockingDeque 与 ConcurrentLinkedDeque

LinkedBlockingDeque 类旨在成为“标准”阻塞双端队列类。当前实现的开销相对较低,但可伸缩性相对较差。...

... ConcurrentLinkedDeque 具有与 LinkedBlockingDeque 几乎相反的性能配置文件相对较高的开销,但非常好的可扩展性。...在并发应用程序中,想要一个线程安全但不支持阻塞的 Deque 并不常见。大多数这样做的人可能会更好地使用特殊情况的解决方案。

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

于 2013-10-04T11:24:02.453 回答
12

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

于 2013-10-04T11:21:03.347 回答
9

两件事情:

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:来自javadoc ConcurrentLinkedDeque

请注意,与大多数集合不同,size 方法不是恒定时间操作。

..

此外,不能保证以原子方式执行批量操作 addAll、removeAll、retainAll、containAll、equals 和 toArray。

以上不正确LinkedBlockingDeque

于 2013-10-04T11:28:45.550 回答
4

首先,LinkedBlockingDeque 和 ConcurrentLinkedDeque 都是线程安全的,但使用哪一个取决于您的应用程序要求。

例如,

LinkedBlockingDequeue : 如果您希望一次只有单个线程可以对您的数据进行操作,并且当您需要阻止您的应用程序时,请使用此集合。

ConcurrentLinkedDeque: 这也是线程安全的集合双端队列,如果您的应用程序是多线程的,并且您希望每个线程都可以访问数据,那么 ConcurrentLinkedDequeue 是最好的选择。

正如你的问题,

1.我需要有一个线程安全的LIFO结构,

如果您希望只有单个线程可以操作您的数据,请使用 LinkedBlockingDeque。

如果您希望每个线程都可以访问共享数据,请使用 ConcurrentLinkedDeque

2.如果忽略阻塞方面,ConcurrentLinkedDeque和LinkedBlockingDeque之间是否还有其他区别,

是的,LinkedBlockingDeque 使用的是锁定机制,而 ConcurrentLinkedDeque 不是,这可能会影响您想要操作数据时的性能。

于 2017-05-13T13:57:02.633 回答