Multithreading blockingqueue与不带take的无锁concurrentqueue相比的强度()

Multithreading blockingqueue与不带take的无锁concurrentqueue相比的强度(),multithreading,lock-free,Multithreading,Lock Free,我是多线程编程的初学者 我一直在多线程环境中使用并发类,但突然我对使用blockingqueue感到好奇 我认为像ConcurrentHashMap这样的并发类使用锁定 最近,我碰巧使用了QUEUE,我研究了线程安全队列。所以我知道有BlockingQueue和linkedConcurrentQueue,我研究了这两个队列 blockingqueue使用锁定是线程安全的。这是我所想的典型的线程安全方式 Concurrentqueue使用一种称为CAS的算法进行线程安全处理。 但是,我不知道这个C

我是多线程编程的初学者

我一直在多线程环境中使用并发类,但突然我对使用blockingqueue感到好奇

我认为像ConcurrentHashMap这样的并发类使用锁定

最近,我碰巧使用了QUEUE,我研究了线程安全队列。所以我知道有BlockingQueue和linkedConcurrentQueue,我研究了这两个队列

blockingqueue使用锁定是线程安全的。这是我所想的典型的线程安全方式

Concurrentqueue使用一种称为CAS的算法进行线程安全处理。 但是,我不知道这个CAS的目标是队列本身还是属于队列的元素。 即使多个线程同时轮询concurrentqueue中的元素,它们是否轮询不同的元素?是否存在一次轮询同一元素的情况

如果是这样,无锁concurrentqueue与blockingqueue相比看起来太好了。。。blockingqueue仍然被弃用并处于活动状态的原因是什么?(take()方法除外)


有没有我想学习或参考的文章?谢谢大家!

阻塞操作不能是无锁的(反之亦然)。无锁操作提供进度保证。以下是以下定义:

当程序线程运行足够长的时间时,如果至少有一个线程取得了进展(对于某些合理的进展定义),则算法是无锁的

被阻止的线程只有在“解除阻止”后才能继续前进。但这通常意味着其他线程必须取得进展才能解除阻塞的线程。因此,阻塞线程取决于其他线程的进度。在无锁操作中,情况并非如此——只有当其他线程正在进行,从而干扰第一个线程时,才能阻止线程进行

这就是为什么无锁队列不能有阻塞pop操作,该操作在队列为空时阻塞,等待其他线程推送项目。相反,它们通常有一个
tryPop
操作来指示它是否成功

(无锁)比较和交换(CAS)操作通常只能在单个指针上执行。这是无锁算法所需的基本操作之一。对于ConcurrentLinkedQueue(这是年Michael和Scott提出的队列的一个实现),使用CAS操作更新头指针和尾指针


并发编程的主题非常广泛和复杂。如果你真的感兴趣,我建议你从这本好书开始。

我没有完全理解。但是谢谢你的回答。我会学习更多。如果你详细说明你不理解的部分,我可以试着解释更多。:-)