在很多 Java 源代码中,(例如 LinkedBlockingDeque
)我看到这样的事情;
final ReentrantLock lock = new ReentrantLock();
public void putLast(E e) throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lock();
try {
// do stuff
} finally {
lock.unlock();
}
}
我了解基本模式(最后锁定,解锁),但我的问题是为什么要在使用之前对局部作用域的 Lock 变量进行赋值?为什么这样做而不是以下? p>
final ReentrantLock lock = new ReentrantLock();
public void putLast(E e) throws InterruptedException {
this.lock.lock();
try {
// do stuff
} finally {
lock.unlock();
}
}
它会影响优化吗?第一个示例可以防止锁粗化吗?
评论后编辑:如果您真的不知道为什么会这样,请不要添加答案。这是来自 Java 源代码,@author 标签是 Doug Lea,所以我很确定它在那里是有原因的。请不要指出代码只是等价的。
谢谢
最佳答案
当你在方法中赋值给局部变量时,编译器可以做一些优化。 见In ArrayBlockingQueue, why copy final member field into local final variable?
关于Java 在使用前锁定变量赋值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56133375/