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

有谁知道方法acquire()和release()(java.util.concurrent.Semaphore)和await()和signal(new ReentrantLock().newCondition())之间的区别.

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

解决方法:

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

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

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

您可以在Brian Goetz的优秀书籍“Java Concurrency in Practice”中找到有关此内容的更多详细信息.

上一篇:linux的文件锁


下一篇:你能安全地同步Java方法参数吗?