我不知道是否像可能性例外的尝试,终于
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(..)
}
引用两个帖子的启发
th在C#的情况下,基于由JIT生成的机器代码,执行永远不会达到try-finally
的可能性很小。
我知道这可能被看作是一个人为的问题/挑剔,但我的好奇心好转了我。
也许与为什么[Thread.stop()已弃用](https://stackoverflow.com/questions/16504140/thread-stop-deprecated)相关。从来没有听说过类似Java中链接的noop这样的问题,但当然这也会依赖于JVM。 – Kayaman
相关:https://stackoverflow.com/questions/31058681/java-locking-structure-best-pattern – assylias
出于所有实际的目的,您可以假设抛出异常并且锁未锁定,否则您将输入try块。显然,这不包括突然的JVM崩溃等,在这种情况下锁发生了什么并不重要... – assylias