try和finally的同步方法的行为

时间:2012-05-24 18:32:43

标签: java synchronized try-finally

假设以下方法:

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

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

3 个答案:

答案 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)

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