同步关键字异常安全吗?

发布于 2024-12-19 22:51:08 字数 416 浏览 3 评论 0原文

可能的重复:
在同步子句中引发异常的副作用?< /a>

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

Possible Duplicate:
Side effects of throwing an exception inside a synchronized clause?

I am wondering if synchronized is exception-safe? Say, an uncaught exception happens within the synchronized block, will the lock be released?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

内心旳酸楚 2024-12-26 22:51:08

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

如果方法主体的执行曾经完成,通常情况下
或者突然,在同一对象上自动执行解锁操作
监控。

When in doubt, check the Java Language Specification. In section 17.1 you'll find:

If execution of the method's body is ever completed, either normally
or abruptly, an unlock action is automatically performed on that same
monitor.

过气美图社 2024-12-26 22:51:08
  1. Synchronize 既不是线程安全的也不是非线程安全的。你提出问题的方式没有意义。
  2. 如果发生异常,锁将被释放。
  1. Synchronize is neither thread-safe nor non-thread-safe. The way you phrased the question just doesn't make sense.
  2. In case of an exception the lock will be released.
半﹌身腐败 2024-12-26 22:51:08

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

并悬挂。 :|

Only a System.exit prevents a block exiting normally. It means finally blocks are not called and locks are not released.

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);
    }
}

prints

Locking

and hangs. :|

无畏 2024-12-26 22:51:08

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

Yes, it will. The major point of the synchronize keyword is to make multi-threaded coding easier.

行雁书 2024-12-26 22:51:08

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

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

Yes the object will become unlocked if an exception is thrown and not caught.

You can find some code examples here.

烟火散人牵绊 2024-12-26 22:51:08

是的,会的。

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

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

Yes it will.

As a side note, the try-finally construct will ensure the finally block will be executed when the try exits

try {
    someFunctionThatMayThrow();
} finally {
    willAlwaysBeExecuted();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文