可能重复:
Side effects of throwing an exception inside a synchronized clause?
我想知道synchronized
是否异常安全吗?比如,在synchronized块中发生未捕获的异常,是否会释放锁定?
答案 0 :(得分:9)
如有疑问,请检查Java Language Specification。在17.1部分,您会找到:
如果方法的正文执行完毕,则正常 或者突然,对其自动执行解锁动作 监视。
答案 1 :(得分:2)
答案 2 :(得分:1)
只有System.exit才能阻止块正常退出。这意味着不会调用finally
块,也不会释放锁。
private static final Object lock = new Object();
public static void main(String... args) throws ParseException {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Locking");
synchronized (lock) {
System.out.println("Locked");
}
}
}));
synchronized (lock) {
System.exit(0);
}
}
打印
Locking
并挂起。 :|
答案 3 :(得分:0)
是的,它会的。 synchronize关键字的主要目的是使多线程编码更容易。
答案 4 :(得分:0)
是的,如果抛出异常并且未捕获异常,该对象将被解锁。
您可以找到一些code examples here.
答案 5 :(得分:0)
是的。
作为旁注,try-finally
构造将确保在try退出时执行finally块
try {
someFunctionThatMayThrow();
} finally {
willAlwaysBeExecuted();
}