Clark To Do The blog of Clark

Semaphore与Condition(ReentrantLock)的区别

    表面上这两个方法的行为是相似的: acquire()/await()在某些情况下可以令线程阻塞, release()/signal()则可以解除阻塞. 然而Semaphore和Condition有着不同的目的:

    1.java.util.concurrent.Semaphore是相对更高级别的同步机制, 旨在供程序员使用. 你可以在访问资源之前, 使请求者线程调用acquire()来限制对资源的并发访问(如果没有semaphore 的许可, 此方法令线程阻塞). javadoc中的描述为:

    Conceptually, a semaphore maintains a set of permits. Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer.

    2.java.util.concurrent.locks.Condition则是一个相对低级别的同步机制, 它主要提升了java.lang.Object methods wait(), notify() and notifyAll()的功能. 当需要等待某些条件为真时(通常通过其它线程的活动), 它使线程暂停活动; 当条件中状态变量变化的时候, 使其他线程”唤醒”正在等待的线程. 通常来说, 正确使用它是比较困难的并且建议开发者使用java.util.concurrent包中更高级的机制(比如: Semaphore).

comments powered by Disqus