Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java lock.lock()然后重试_Java_Locking_Java.util.concurrent - Fatal编程技术网

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();
 }