信号量和条件之间的区别(ReentrantLock)

时间:2012-09-28 14:25:18

标签: java concurrency locking semaphore

有谁知道方法acquire ()release ()java.util.concurrent.Semaphore)和await ()以及signal (new ReentrantLock().newCondition() )之间的差异。

你能为这些方法公开一个伪代码吗?

1 个答案:

答案 0 :(得分:10)

从表面上看,这些方法的行为可能看起来相似 - acquire()/await()可以使线程在某些情况下阻塞,release()/signal()可以在某些情况下解除阻塞线程。但是,信号量和条件有不同的用途:

  • java.util.concurrent.Semaphore是相对较高级别的同步机制,供一般开发人员使用。您通常会使用它来限制对某些资源的并发访问,方法是在访问资源之前使每个请求者线程调用acquire()(如果没有可用的信号量许可,那么就会产生线程阻塞)。 来自javadoc的描述:

      

    从概念上讲,信号量保持一组许可。如果需要,每个acquire()都会阻止,直到有许可证可用,然后接受它。每个版本()都会添加一个许可证,可能会释放阻止收购者。

  • java.util.concurrent.locks.Condition是相对较低级别的同步机制,它基本上增强了java.lang.Object方法wait()notify()notifyAll()提供的功能。它允许线程在需要等待某些条件变为真时(通常通过其他线程的活动)暂停其活动,然后它使那些其他线程在状态变量采取时“唤醒”等待的线程条件中的部分可能已经改变。它通常更难正确使用,建议一般开发人员使用java.util.concurrent包中的更高级别的机制(如Semaphore)。

您可以在Brian Goetz的优秀书籍“Java Concurrency in Practice”中找到更多详细信息。