Java ConcurrentLinkedQue与LinkedBlockingDeque

Java ConcurrentLinkedQue与LinkedBlockingDeque,java,multithreading,data-structures,concurrency,Java,Multithreading,Data Structures,Concurrency,我需要一个线程安全的后进先出结构,并发现我可以为此使用Deque的线程安全实现。Java7已经引入,Java6已经引入 如果我只使用LinkedBlockingDeque中的非阻塞方法,例如addFirst()和removeFirst()与ConcurrentLinkedDeque有什么区别吗 i、 e.如果忽略阻塞方面,除了LinkedBlockingDeque被绑定之外,ConcurrentLinkedQueue和LinkedBlockingDeque之间是否还有其他区别?当LinkedBl

我需要一个线程安全的后进先出结构,并发现我可以为此使用
Deque
的线程安全实现。Java7已经引入,Java6已经引入

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


i、 e.如果忽略阻塞方面,除了
LinkedBlockingDeque
被绑定之外,
ConcurrentLinkedQueue
LinkedBlockingDeque
之间是否还有其他区别?

当LinkedBlockingQueue使用锁定时,ConcurrentLinkedQueue是无锁的(请参见源代码中的注释)。也就是说,前者被认为是更有效的

引用伟大的(我的重点)

LinkedBlockingDeque与ConcurrentLinkedDeque

LinkedBlockingDeque类旨在成为“标准”阻塞deque类。当前实现的开销相对较低,但可扩展性相对较差

ConcurrentLinkedQue的性能与LinkedBlockingDeque几乎相反:开销相对较高,但可扩展性非常好。。。在并发应用程序中,想要一个线程安全但不支持阻塞的Deque并不常见。而大多数这样做的人可能会因为特例解决方案而变得更好

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

的功能:

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
方法。在
ConcurrentLinkedQue
中,这两种方法的锁定行为不同,效率更高,因为它不会锁定整个列表,而是其中的一个子集,检查
ConcurrentLinkedQue
的源代码将使您更清楚地了解这一点

2:来自
ConcurrentLinkedQue
的javadoc:

public E removeFirst() {
        E x = pollFirst();
        ..
    }
 public E pollFirst() {
        lock.lock(); //Common lock for while list
        try {
            return unlinkFirst();
        } finally {
            lock.unlock();
        }
    }
请注意,与大多数集合不同,size方法不是 恒定时间操作

此外,批量操作addAll、removeAll、retainal、, containsAll、equals和toArray不保证执行 原子的


对于
LinkedBlockingDeque

而言,上述情况并非如此。首先,LinkedBlockingDeque和ConcurrentLinkedDeque都是线程安全的,但使用哪一种取决于您的应用程序要求

比如说,

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

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

就像你的问题一样

1。我需要一个线程安全的后进先出结构,

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

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

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


是的,由于LinkedBlockingDeque使用的是锁定机制,而ConcurrentLinkedDeque使用的是锁定机制,因此存在差异。这可能会在您想要操作数据时影响性能

你有没有研究过这两种方法的实施情况?你的标准是什么,你会选择其中一个而不是另一个?演出MemoryOverhead?我只是想知道如果我继续使用Java 6并使用LinkedBlockingDequeNote会失去什么,尽管他在2004年非正式地说。addAll等在LinkedBlockingQueue中也是非原子的。它使用迭代器反复获取并释放锁