Java lock.lock()然后重试
以下两者之间有什么区别吗Java lock.lock()然后重试,java,locking,java.util.concurrent,Java,Locking,Java.util.concurrent,以下两者之间有什么区别吗 private Lock lock = new ReentrantLock(true); public void getIn (int direction) throws InterruptedException { lock.lock(); try { ... 及 编译进行顺利,程序也可以运行(我指的是相同的输出) 我应该把锁锁上吗;尝试之前还是之后 感谢您对第一种情况的帮助:如果lock.lock()抛出Interrupt
private Lock lock = new ReentrantLock(true);
public void getIn (int direction) throws InterruptedException {
lock.lock();
try {
...
及
编译进行顺利,程序也可以运行(我指的是相同的输出)
我应该把锁锁上吗;尝试之前还是之后
感谢您对第一种情况的帮助:如果
lock.lock()
抛出InterruptedException
,getIn
将管理它。但对于任何其他异常,它都会抛出一个异常,getIn
不会处理该异常:运行时异常
在第二种情况下:InterruptedException
之外,try-catch
块也在做一些异常处理,这里没有显示。这应该抛出较少的异常,因为内部块也捕获了一些异常
整个运行取决于什么异常
lock.lock()
抛出?假设lock
是一个,那么它没有真正的区别,因为它不会抛出任何已检查的异常
但是,Java文档将lock()
放在ReentrantLock
示例中的try
块之外。原因是lock()
中未经检查的异常不应导致unlock()
被错误调用。在所有事物的lock()
中存在未检查的异常时,正确性是否是一个问题,这完全是另一个讨论
一般来说,将
try
块尽可能细粒度地保存是一种良好的编码实践。try语句还包含:
} finally {
lock.unlock();
}
也就是说,如果将lock.lock()
放在try
之后,则lock.lock()
引发的异常将导致
lock.unlock()
,这是错误的,因为未获得锁,解锁将导致另一个异常。因此,第一个变体是正确的。要处理由lock.lock()
引发的异常,您必须使用另一个try语句。如果情况不是1,则在最后
中,您可以说unlock()
。在第二种情况下,您需要在unlock()
之前检查您是否持有锁,否则您可能会获得IllegalMonitorStateException
捕获到什么?如果您稍后捕获到异常atlock cannothrow——它们与以前的几个州没有任何区别:private Lock;然后lock=newreentrantlock(true);谢谢…解锁操作在最后通过完成;最后}lock.unlock();该方法不会引发InterruptedException。getIn
方法中的块实际上是try finally
块,而不是try catch
块。
} finally {
lock.unlock();
}