信号量和条件(ReentrantLock)之间的区别
有谁知道方法acquire ()
和release ()
(java.util.concurrent.Semaphore
)和await
()和之间的差异signal (new ReentrantLock().newCondition() )
。
您可以为每种方法公开伪代码吗?
回答:
从表面上看,这些方法的行为可能看起来很相似- 在某些情况下acquire()/await()
可能使线程阻塞,release()/signal()
在某些情况下可能会导致线程阻塞。但是,信号量和条件有不同的用途:
java.util.concurrent.Semaphore
是相对较高级别的同步机制,供一般开发人员使用。您通常会使用它来限制对某些资源的并发访问acquire()
,方法是在访问资源之前先进行每个请求者线程调用(如果没有信号灯许可,则使线程阻塞)。来自Javadoc的说明:
从概念上讲,信号量维护一组许可证。如有必要,每个Acquisition()会阻塞,直到获得许可为止,然后再获取许可。每个release()添加一个许可,有可能释放阻塞获取者。
java.util.concurrent.locks.Condition
是相对较低级别的同步机制,基本上可以增强提供的java.lang.Object
方法的功能wait()
,notify()
并且notifyAll()
。它使线程在需要等待某种条件变为真时挂起其活动(通常通过其他线程的活动),然后使其他线程能够在状态变量占用时“唤醒”正在等待的线程。条件中的一部分可能已更改。通常很难正确使用,建议一般开发人员使用java.util.concurrent包中的高级机制(例如Semaphore)。
您可以在Brian Goetz的出色著作“ Java Concurrency in Practice”中找到有关此问题的更多详细信息。
以上是 信号量和条件(ReentrantLock)之间的区别 的全部内容, 来源链接: utcz.com/qa/413284.html