可以/应该`signalAll`在`finally`块内吗?

时间:2017-02-16 21:26:50

标签: java thread-safety locking conditional-statements try-catch-finally

使用带有DataFolder.Release.config的{​​{1}}时,例如

Lock

和锁定,即

Condition

然后虽然不能继续,例如,

ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();

我们lock.lock(); try { while (!ok_to_continue) {

await

然后,通常,在我们完成线程不安全业务之后,使用{{1}发出任何或所有condition线程的信号{}}块中的{}或 condition.await(); } ,即

await

确保解锁之前,即:

signal

通常 我的意思是:按照编程教师的建议,Java书籍 [1] 和Oracle [2] < / sup>在signalAll块中调用trycondition.signalAll(); 方法。根据Oracle的文档,这些方法通常在当前线程持有相应的} finally { lock.unlock(); } 时调用。这是否意味着signalsignalAll方法也可以在try块中而不是之前调用?为什么典型Lock块中发出signal线程信号,线程不安全业务可能会抛出异常?换句话说,我们无法确定是否会调用signalAllfinally方法,我是否正确?那么为什么通过在await块中调用它们来确保 被调用是不常见的?那就是:

try

通过在signal块中调用其中一个,我们确保激活signalAll线程并防止死锁。

这两种构造的用途是什么?为什么Oracle会使用finally块中的条件而不是} finally { condition.signalAll(); lock.unlock(); } 块中的条件?

0 个答案:

没有答案