gpt4 book ai didi

java - 等待/通知的无锁变体

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:08 25 4
gpt4 key购买 nike

Java 要求线程在调用o.wait()o.notify() 之前拥有o 的监视器。这是众所周知的事实。然而,互斥锁是任何此类机制工作所必需的吗?如果有一个 API 可以提供

compareAndWait

setAndNotify

相反,将 CAS 操作与线程调度/取消调度相结合?这会有一些优势:

  • 即将进入等待状态的线程不会妨碍通知线程的进行;

  • 他们也不必互相等待就可以检查等待情况;

  • 在通知端,任意数量的生产者线程可以同时进行。

提供这样的 API 是否存在根本的、无法克服的障碍?

最佳答案

使用 LockSupport.park() 实现任意等待/通知机制没有问题和 LockSupport.unpark(Thread)因为这些基本原语不需要持有任何锁。

Object.wait/Object.notifyCondition 都没有的原因.await/Condition.signal 在不持有锁的情况下为您提供这样的通知是语义。通知的概念是一个线程等待条件满足,而另一个线程在条件变为已满足状态时停止等待。如果不持有与该条件关联的锁,则无法保证在条件状态测试和线程状态更改之间条件不会发生变化。

更具体地说,当改变条件的线程通知另一个线程时,条件可能在通知发生之前再次被修改。但更糟糕的是,在线程开始等待之前,条件可能会变为“已满足”,在这种情况下,线程可能会错过通知并永远挂起。

即使您能够将条件测试和等待操作融合为一个原子操作,也无济于事。等待条件本身并不是目的。线程想要等待条件的原因是它想要执行一个条件是先决条件的操作,因此在执行操作时不得更改。这就是重点:无论锁的概念是如何实现的,条件测试和操作都必须作为一个持有锁的操作来实现。

有些特殊情况不会出现此类问题,例如当已知条件的状态转换是有限的时,您可以阻止条件返回到未满足的状态。这正是 CountDownLatchCyclicBarrierPhaser 等工具的用途,但具有预定义等待/通知语义的通知机制并不意味着假设这样一个特例。

关于java - 等待/通知的无锁变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32246807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com