可能重复:
在同步子句中抛出异常的副作用?
我想知道是否synchronized
是异常安全的?比如说,在同步块中发生了未捕获的异常,锁会被释放吗?
可能重复:
在同步子句中抛出异常的副作用?
我想知道是否synchronized
是异常安全的?比如说,在同步块中发生了未捕获的异常,锁会被释放吗?
只有 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
并挂起。:|
是的,如果抛出异常但未被捕获,则对象将解锁。
您可以在此处找到一些代码示例。
是的,它会的。
附带说明一下,该try-finally
构造将确保在 try 退出时执行 finally 块
try {
someFunctionThatMayThrow();
} finally {
willAlwaysBeExecuted();
}
是的,它会的。synchronize 关键字的主要目的是使多线程编码更容易。