Java 在finally{}中解锁时返回值

Java 在finally{}中解锁时返回值,java,concurrency,locking,Java,Concurrency,Locking,我想知道这段代码是否是线程安全的: public class SafeSequenceWithLock implements Sequence { private int value = 0; Lock lock = new ReentrantLock(); @Override public int getAndIncrement() { lock.lock(); try{ value++; return value;

我想知道这段代码是否是线程安全的:

public class SafeSequenceWithLock implements Sequence {

  private int value = 0;
  Lock lock = new ReentrantLock();
  @Override
  public int getAndIncrement() {
    lock.lock();
    try{
        value++;    
        return value;
    }finally{
        System.out.println("XXX");
        lock.unlock();
    }
  }
}
锁定的锁是否会一直保持到返回值之后,或者这与使用

lock.lock();  
value++;
lock.unlock();
// another thread could change "value" here!
return value;

…?

对于您的特定示例,它将与您提到的相同:锁将被解锁,然后返回值:在方法返回之前调用finally块。

对于您的特定示例,它将与您提到的相同:锁将被解锁,然后返回值:在方法返回之前调用finally块。

您正在使用推荐的表单。请看,这两个片段实际上并不等同。从“以前发生过”的角度来看,在积极的情况下,是的。但如果发生故障,锁可能不会在第二个代码段中释放。当然,后一种方法对于异常来说并不安全。我也可以用try{}catch{}来包装这个。但问题是,如果我将返回放入finally{}-statement,那么在返回值之前,另一个线程是否可以进行干预。是的,也可能是这样。您使用的是推荐的形式。请看,这两个片段实际上并不等同。从“以前发生过”的角度来看,在积极的情况下,是的。但如果发生故障,锁可能不会在第二个代码段中释放。当然,后一种方法对于异常来说并不安全。我也可以用try{}catch{}来包装这个。问题是,如果我将返回放入finally{}-statement,那么另一个线程是否可以在返回值之前进行干预。是的,也可能是这样。它们不是“相同的”。这个示例很简单,但通常情况下,您可能会遇到异常,在没有try/finally的情况下将锁锁定在代码段中。OP提供的代码是相同的。但是,很好的一点,我将编辑答案来显示这一点!谢谢你的回复。所以这两种方法都不能避免线程的介入,对吗?不,您应该将++的结果保存在局部变量中,然后返回该局部变量。例如:
intlocalvalue=value++;返回localValue它们不“相同”。这个示例很简单,但通常情况下,您可能会遇到异常,在没有try/finally的情况下将锁锁定在代码段中。OP提供的代码是相同的。但是,很好的一点,我将编辑答案来显示这一点!谢谢你的回复。所以这两种方法都不能避免线程的介入,对吗?不,您应该将++的结果保存在局部变量中,然后返回该局部变量。例如:
intlocalvalue=value++;返回localValue