在尝试之前lock.lock()

962*_*001 16 java locking java.util.concurrent

之间有什么区别:

private Lock lock = new ReentrantLock(true);

public void getIn (int direction) throws InterruptedException {

     lock.lock();
     try {
         ...
Run Code Online (Sandbox Code Playgroud)

...

public void getIn (int direction) throws InterruptedException {

      try {
          lock.lock();
          ...
Run Code Online (Sandbox Code Playgroud)

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

我应该把lock.lock(); 在尝试之前或之后?...

谢谢你的帮助

thk*_*ala 16

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

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

一般来说,保持像try块一样的细粒度是一种很好的编码实践.


Op *_*kel 9

如果是1号案例,finally你可以说unlock().在No2的情况下你需要检查你之前是否持有锁unlock(),否则你可以得到IllegalMonitorStateException


Ale*_*dov 6

try 语句还包含:

 } finally {
     lock.unlock();
 }
Run Code Online (Sandbox Code Playgroud)

也就是说,如果放在lock.lock()之后try,抛出的异常 lock.lock()会导致 lock.unlock(),这是错误的,因为没有获得锁,解锁会导致另一个异常。所以第一个变体是正确的。要处理抛出的异常,lock.lock()您必须使用另一个 try 语句。


dam*_*ned 0

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

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

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