2

如果我做

try(Lock lock = lockProvider.lock()) {
    // some code that doesn't use variable lock
}

编译器或 JITer 是否存在删除锁创建的风险,因为它认为它在块内未使用?


后期编辑:

一点上下文。我来自 .NET 背景,在 C# 中,允许执行以下操作:

using(Transaction tx = BeginTransaction())
{
    // code that does things without touching the tx variable, such as SQL connections and stuff
}

事实上,它甚至可以缩短为

using(BeginTransaction())
{
    // code that does things without touching the tx variable, such as SQL connections and stuff
}

静态编译器和 JIT 编译器将保留BeginTransaction调用,并且在运行时它总是会发生。

然而,在 Java 中,使用 try-with-resources 处理其他资源似乎存在很多问题和消极情绪。

4

1 回答 1

6

不,锁没有被优化掉的风险,至少假设它的lock()close()方法实际上不是无操作,而是执行同步操作。

您引用的“消极性”与正确性无关,而只是按照预期的方式使用该工具,以及其他工具(如静态分析器)如何在您AutoCloseable违背该意图时为您提供误导性指导。

顺便说一句,如果你这样做,我建议你调用你的包装器,而不是Lock避免与java.util.concurrent.Lock.

于 2018-03-07T16:47:44.503 回答