21

有什么区别:

private Lock lock = new ReentrantLock(true);

public void getIn (int direction) throws InterruptedException {

     lock.lock();
     try {
         ...

...

public void getIn (int direction) throws InterruptedException {

      try {
          lock.lock();
          ...

编译顺利,程序也可以工作(我的意思是相同的输出)

我应该放 lock.lock(); 尝试之前还是之后?...

谢谢你的帮助

4

4 回答 4

24

假设它lock是 a ReentrantLock,那么它没有真正的区别,因为lock()不会抛出任何检查异常。

然而,Java 文档在示例中的块lock()之外。这样做的原因是未经检查的异常不应导致错误地被调用。在所有事物中都存在未经检查的异常时,正确性是否是一个问题,这完全是另一个讨论。tryReentrantLocklock()unlock()lock()

一般来说,保持try块之类的东西尽可能细粒度是一种很好的编码实践。

于 2012-06-03T06:53:22.497 回答
10

如果是第 1 种情况,finally你可以说unlock()。万一No2你需要检查你之前是否持有锁unlock(),否则你可以得到IllegalMonitorStateException

于 2012-06-03T07:05:26.460 回答
6

The try statement also contains:

 } finally {
     lock.unlock();
 }

That is, if you place lock.lock() after try, exceptions thrown by lock.lock() would cause lock.unlock(), which is wrong, because lock was not obtained, and unlocking would cause another exception. So the first variant is correct. To handle exceptions thrown by lock.lock() you have to use another try statement.

于 2012-06-03T06:56:28.917 回答
0

在第一种情况下:如果lock.lock()throws InterruptedExceptiongetIn将管理它。但对于任何其他异常,它会抛出一个getIn不处理的异常:运行时异常

在第二种情况下:除了 之外InterruptedException,该try-catch块还进行了一些异常处理,您没有在此处显示。这应该会引发较少的异常,因为内部块也捕获了一些异常。

整体运行取决于lock.lock()抛出什么异常?

于 2012-06-03T06:47:23.590 回答