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
混淆。
如果我这样做
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
混淆。