我是一个多线程编程的初学者。
我一直在多线程环境中使用并发类,但突然间我对使用阻塞队列感到好奇。
我认为像ConcurrentHashMap这样的并发类使用锁定。
最近,我碰巧使用了队列,我查看了线程安全队列。所以我知道有BlockingQueue和linkedConcurrentQueue,我研究了这两个队列。
使用锁定,阻塞队列是线程安全的。这就是我想的典型的线程安全方式。
Concurrentqueue通过使用名为CAS的算法处理线程安全。但是,我不知道这个CAS的目标是队列本身还是属于队列的元素。即使多个线程同时轮询并发队列中的元素,它们是否轮询不同的元素?难道没有一种情况是一次投票同一元素吗?
如果是这样的话,与阻塞队列相比,无锁并发队列看起来太好了.阻塞队列仍然被废弃和存活的原因是什么?(取()法除外)
有什么文章我想学习或参考吗?谢谢!
发布于 2020-07-08 08:40:23
阻塞操作不能是无锁的(反之亦然)。无锁操作提供了进度保证。以下是维基百科的定义
如果程序线程在足够长的时间内运行,至少有一个线程取得进展(对于某些合理的进度定义),则算法是无锁的。
被阻塞的线程在“解除阻塞”之前无法取得进展。但这通常意味着某些其他线程必须已经取得进展,才能解除阻塞线程的阻塞。因此,阻塞的线程取决于其他线程的进度。在无锁操作中,这种情况不是这样的--只有当某个其他线程正在进步,从而干扰第一个线程时,才能阻止线程取得进展。
这就是为什么没有锁的队列不能有阻塞的pop操作,如果队列是空的,等待其他线程推送一个项。相反,它们通常有一个tryPop操作,指示它是否成功。
(无锁)比较和交换(CAS)操作通常只能在单个指针上执行.它是无锁算法所需的基本操作之一.对于ConcurrentLinkedQueue (它是迈克尔和斯科特在简单、快速、实用的非阻塞和阻塞并发队列算法中提出的队列的实现),头和尾指针是使用简单、快速、实用的非阻塞和阻塞并发队列算法操作更新的。
并发编程是一个非常广泛和复杂的课题。如果你真的感兴趣,我建议从优秀的书多处理器编程艺术开始。
https://stackoverflow.com/questions/62790072
复制相似问题