我只想知道为什么非阻塞并发比阻塞并发更好。在阻塞并发中,您的线程必须等待其他线程完成其执行。因此,在那种情况下线程不会消耗CPU。

但是,如果我谈论的是非阻塞并发,线程就不会等待获取锁,如果某些线程包含该锁,它们会立即返回。

例如在ConcurrentHashMap类的示例中,在put()方法内部的循环中是tryLock()。其他线程将处于活动状态,并会继续尝试检查锁定是否已释放,因为tryLock()为非阻塞。我假设在这种情况下,不需要使用CPU。

因此,在其他线程完成其执行并在工作完成后唤醒该线程之前,挂起该线程是否不好?

最佳答案

阻塞或非阻塞并发是否更好取决于您期望等待多长时间才能获取正在等待的资源。

有了阻塞等待(即C语言中的互斥锁),操作系统内核将等待线程置于睡眠状态。在所需的资源可用之前,CPU调度程序不会为它分配任何时间。如您所说,这样做的好处是,该线程在休眠时不会消耗任何CPU资源。

但是,这有一个缺点:使线程进入睡眠状态,确定何时应唤醒它并再次唤醒它的过程既复杂又昂贵,并且可能会抵消在等待时不消耗线程而节省的成本。另外(可能是因为这样),操作系统可能选择在资源可用后不立即唤醒线程,因此锁定等待的时间可能比必要的时间长。

无阻塞等待(也称为自旋锁)确实在等待时消耗了CPU资源,但节省了使线程进入睡眠状态,确定何时应唤醒并唤醒线程的开销。一旦锁定释放,它也可能会更快地做出响应,因为就操作系统何时开始执行而言,它一时兴起的机会更少。

因此,作为一条非常普遍的规则,如果希望仅等待一小段时间(例如,另一个线程完成ConcurrentHashMap中的输入可能需要花费几个CPU周期),则应该使用自旋锁。对于更长的等待时间(例如,在同步I / O上,或者正在等待单个复杂计算的多个线程),互斥锁(阻塞等待)可能更可取。

09-10 04:53
查看更多