2

假设以下方法:

public synchronized void a(){
    try{
        System.out.println("a");
        return;
    }finally{
        System.out.println("a, finally");
    }
}

我知道即使在 return 语句之后,finally 块仍然会被执行。甚至可以“覆盖”返回值!但我的问题是,该方法会在 return 语句之后还是 finally 之后解锁?

4

3 回答 3

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");
    }
}
于 2012-05-24T18:35:48.933 回答
1

第一个 finally 将在 return 语句之前执行....

其次,只有当线程执行完完整方法时才会释放锁。即(直到该方法的结束大括号),此外,该锁是对象的,因此不仅是该方法,而且该方法中的所有同步方法类被锁定。

于 2012-05-24T18:36:31.120 回答
0

是的。它将等待从执行 finally 块执行后发生的函数返回。

于 2012-05-24T18:58:06.393 回答