1

可能重复:
在同步子句中抛出异常的副作用?

我想知道是否synchronized是异常安全的?比如说,在同步块中发生了未捕获的异常,锁会被释放吗?

4

6 回答 6

9

如有疑问,请查看Java 语言规范。在第17.1节中,您会发现:

如果方法主体的执行已经完成,无论是正常的还是突然的,都会在同一个监视器上自动执行解锁操作。

于 2011-12-06T00:39:30.230 回答
2
  1. 同步既不是线程安全的,也不是非线程安全的。您提出问题的方式没有意义。
  2. 如果发生异常,锁将被释放。
于 2011-12-06T00:39:21.300 回答
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

并挂起。:|

于 2011-12-06T08:21:59.257 回答
0

是的,如果抛出异常但未被捕获,则对象将解锁。

您可以在此处找到一些代码示例。

于 2011-12-06T00:40:07.750 回答
0

是的,它会的。

附带说明一下,该try-finally构造将确保在 try 退出时执行 finally 块

try {
    someFunctionThatMayThrow();
} finally {
    willAlwaysBeExecuted();
}
于 2011-12-06T00:40:31.847 回答
0

是的,它会的。synchronize 关键字的主要目的是使多线程编码更容易。

于 2011-12-06T00:39:03.877 回答