【发布时间】:2015-08-27 10:22:15
【问题描述】:
在调用o.wait() 或o.notify() 之前,Java 需要一个线程拥有o 的监视器。这是众所周知的事实。但是,任何此类机制都需要互斥锁才能正常工作吗?如果有提供的 API 会怎样
compareAndWait
和
setAndNotify
相反,将 CAS 操作与线程调度/取消调度相结合?这会有一些好处:
即将进入等待状态的线程不会阻碍通知线程的进度;
他们也不必在被允许检查等待条件之前互相等待;
在通知端,任意数量的生产者线程可以同时进行。
提供这样的 API 是否存在根本的、不可克服的障碍?
【问题讨论】:
-
Lock是在不使用等待/通知的情况下编写的。它在引擎盖下使用 CAS。 -
但是我们仍然需要获取 Lock 才能使用它的 Condition。
-
您能稍微扩展一下
compareAndWait和setAndNotify的作用吗?compareAndWait听起来像Semaphore,而setAndNotify听起来像BlockingQueue.put()。 -
@OldCurmudgeon 与信号量的类比是一个很好的类比。所以结论可能是这样的功能确实存在,
wait/notify特别适用于您实际需要锁定的情况。 -
“等待/通知的无锁变体”是什么意思?无锁算法是一种保证在任何时候都至少有一个参与线程能够取得进展的算法。但是,当算法的目的是让线程等待某事时,“取得进展”是什么意思?
标签: java multithreading