【发布时间】:2017-10-09 19:52:50
【问题描述】:
我想知道给定的代码是否像
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
在执行lock 方法之后但在进入try-finally 块之前,是否有可能以某种方式终止正在执行的线程?这将导致一个被占用但从未被释放的锁。 Java/JVM 规范中是否有某些行可以保证如果使用该习惯用法编写代码,则不会留下永远锁定的锁定?
我的问题受到 C# 相关问题Can Monitor.Enter throw an exception? 的回答的启发,该问题引用了 MSDN 上的两个帖子
- https://blogs.msdn.microsoft.com/ericlippert/2007/08/17/subtleties-of-c-il-codegen/
- https://blogs.msdn.microsoft.com/ericlippert/2009/03/06/locks-and-exceptions-do-not-mix/
关于类似代码的问题
Monitor.Enter(...)
try
{
...
}
finally
{
Monitor.Exit(..)
}
在 C# 的情况下,根据 JIT 生成的机器代码,执行永远不会到达 try-finally 的可能性很小。
我知道这可能被视为一个人为的问题/吹毛求疵,但我的好奇心越来越好。
【问题讨论】:
-
可能与为什么Thread.stop() is deprecated有关。从未听说过像 Java 中存在链接中的 noop 这样的问题,但当然这也取决于 JVM。
-
出于所有实际目的,您可以假设抛出异常并且锁未锁定,或者您将进入 try 块。显然,这不包括突然的 JVM 崩溃等,在这种情况下,锁发生了什么并不重要......
标签: java multithreading