为什么锁定被捕获到局部变量

mik*_*och 6 java reentrantlock

在java JRE中我看到了代码

private final ReentrantLock lock;
public E poll() {
        final ReentrantLock lock = this.lock;
        lock.lock();
Run Code Online (Sandbox Code Playgroud)

为什么锁定被捕获到私有变量?我希望简单

public E poll() {
        lock.lock();
Run Code Online (Sandbox Code Playgroud)

Tom*_*ine 0

主要是为了确保最大性能。尽管这是真正的微优化,但它可能是在性能敏感的代码中,您不妨这样做。

您还需要非常小心,确保您使用的锁引用不会发生变化。当然要创建该字段final,但采用final本地引用是本地明确的。

  • 嗯,事情没那么简单——它可以避免整个缓存未命中,甚至页面错误。这样做的理由多于不这样做的理由。 (2认同)
  • 我相信性能是经过衡量的。道格就是这样的人。字节码大小也会影响 HotSpot 是否内联。 (2认同)