假设以下方法:
public synchronized void a(){
try{
System.out.println("a");
return;
}finally{
System.out.println("a, finally");
}
}
据我所知,即使在return语句之后仍然会执行finally块。甚至可以“覆盖”返回值! 但我的问题是,该方法是在return语句之后还是在最终之后解锁?
答案 0 :(得分:2)
由于在return
块完成之前未执行finally
,并且因为整个方法都是synchronized
,因此在finally
块完成之后才会释放锁定
如果您需要在异常时释放锁定而不是从方法返回,则可以将synchronized
块嵌套在try
/ finally
块中:
public void a(){
try {
synchronized (this) {
System.out.println("a");
return;
}
} finally{
System.out.println("a, finally");
}
}
答案 1 :(得分:1)
最终将在return语句之前执行....
其次只有当线程完成执行完整方法时才会释放锁。即(直到此方法的结束括号),而且这个锁是对象的,所以不仅这个方法,而且所有的同步该类中的方法被锁定。
答案 2 :(得分:0)