有谁知道方法acquire ()
和release ()
(java.util.concurrent.Semaphore
)和await ()
和之间的区别signal (new ReentrantLock().newCondition() )
。
你可以为这些方法中的每一个公开一个伪代码吗?
有谁知道方法acquire ()
和release ()
(java.util.concurrent.Semaphore
)和await ()
和之间的区别signal (new ReentrantLock().newCondition() )
。
你可以为这些方法中的每一个公开一个伪代码吗?
从表面上看,这些方法的行为可能看起来很相似——在某些情况下acquire()/await()
可以使线程阻塞,release()/signal()
在某些情况下可以解除线程阻塞。但是 Semaphore 和 Condition 有不同的用途:
java.util.concurrent.Semaphore
是比较高级的同步机制,供一般开发者使用。您通常会使用它来限制对某些资源的并发访问acquire()
,方法是在访问资源之前进行每个请求者线程调用(如果没有可用的信号量许可,则使线程阻塞)。来自javadoc的描述:
从概念上讲,信号量维护一组许可。如有必要,每个 acquire() 都会阻塞,直到获得许可,然后再接受它。每个 release() 添加一个许可,可能会释放一个阻塞的获取者。
java.util.concurrent.locks.Condition
是相对低级的同步机制,它基本上增强了提供java.lang.Object
方法的功能wait()
,notify()
并且notifyAll()
. 它使线程在需要等待某个条件变为真时(通常通过其他线程的活动)暂停其活动,然后当状态变量占用时,它使那些其他线程能够“唤醒”等待线程条件的一部分可能已经改变。它通常更难正确使用,建议一般开发人员使用 java.util.concurrent 包中的高级机制(如 Semaphore)。
您可以在 Brian Goetz 的优秀书籍“Java Concurrency in Practice”中找到更多详细信息。