同步关键字异常安全吗?

时间:2011-12-06 00:35:45

标签: java exception synchronized exception-safe exception-safety

  

可能重复:
  Side effects of throwing an exception inside a synchronized clause?

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

6 个答案:

答案 0 :(得分:9)

如有疑问,请检查Java Language Specification。在17.1部分,您会找到:

  

如果方法的正文执行完毕,则正常   或者突然,对其自动执行解锁动作   监视。

答案 1 :(得分:2)

  1. Synchronize既不是线程安全的,也不是非线程安全的。你提出这个问题的方式没有意义。
  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();
}