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



我是多线程编程的初学者。

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

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

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

阻塞队列使用锁定是线程安全的。这是我思考的典型线程安全方式。

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

如果是这样的话,与blockingqueue相比,无锁并发队列看起来太好了。。。blockingqueue仍然被弃用和激活的原因是什么?(take((方法除外(

有什么我想研究或参考的文章吗?非常感谢。

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

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

被阻塞的线程在被"阻塞"之前无法进行进程;"未阻塞";。但这通常意味着其他线程必须已经取得了进展才能解锁被阻止的线程。因此被阻塞的线程依赖于其他线程的进度。在无锁操作中,情况并非如此——只有当其他线程正在进行进程,从而干扰第一个线程时,才能阻止线程进行进程。

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

(无锁定(Compare-And-Swap(CAS(操作通常只能在单个指针上执行。它是无锁算法所需的基本操作之一。在并发链接队列(这是Michael和Scott在简单、快速和实用的非阻塞和阻塞并发队列算法中提出的队列的实现(的情况下,使用CAS操作更新头和尾指针。

并发编程的主题相当广泛和复杂。如果你真的感兴趣,我建议你从优秀的书《多处理器编程的艺术》开始。

最新更新