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代码>