Java 8 中 try-with-resources 块中的锁定风险

Risks for locks in try-with-resources blocks in Java 8

如果我这样做

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

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


稍后编辑:

一些上下文。我来自 .NET Background,在 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 中似乎存在很多问题,并且 negativity 关于将 try-with-resources 用于其他资源的问题。

不,不存在锁被优化掉的风险,至少假设其 lock()close() 方法实际上不是 no-ops,而是执行同步操作。

您引用的 "negativity" 与正确性无关,而只是按预期方式使用该工具,以及其他工具(如静态分析器)如何在您使用 AutoCloseable 与该意图相反。

顺便说一句,如果您这样做,我建议您将包装器命名为 Lock 以外的名称,以避免与 java.util.concurrent.Lock 混淆。