【问题标题】:Is synchronized keyword exception-safe? [duplicate]同步关键字异常安全吗? [复制]
【发布时间】:2012-01-13 16:46:51
【问题描述】:

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

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

【问题讨论】:

  • 在任何作用域的线程安全块中,一旦你离开它,线程安全就消失了。
  • 您的意思是“synchronized 构造 exception-safe 吗?”?

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


【解决方案1】:

如有疑问,请查看Java Language Specification。在17.1 部分你会发现:

如果方法主体的执行已经完成,要么正常 或突然,解锁操作会自动在同一设备上执行 监视器。

【讨论】:

    【解决方案2】:
    1. 同步既不是线程安全的,也不是非线程安全的。你提出问题的方式没有意义。
    2. 如果发生异常,锁将被释放。

    【讨论】:

    • +1 - 问题的第一部分是荒谬的。 OP - 请查看“线程安全”的定义。
    【解决方案3】:

    只有 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
    

    然后挂起。 :|

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      【解决方案5】:

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

      你可以找到一些code examples here.

      【讨论】:

        【解决方案6】:

        会的。

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

        try {
            someFunctionThatMayThrow();
        } finally {
            willAlwaysBeExecuted();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 2019-04-28
          • 1970-01-01
          • 2012-01-12
          • 2018-11-16
          相关资源
          最近更新 更多