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中也是非原子的。它使用迭代器反复获取并释放锁