0%

final

1. 局部变量的引用

在 JDK 源码中可以看到会用到 final 的局部变量引用对象的属性, 如像 ArrayBlockingQueue 中:

1
2
3
4
5
6
7
8
9
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();
try {
return (count == 0) ? null : dequeue();
} finally {
lock.unlock();
}
}

这样做有什么好处呢?

首先代码逻辑没有任何问题.
假如我们直接 this.lock, 会在字节码中产生如下操作:

1
2
aload_0 # 表示当前对象
getfield # 获取对象的属性

但是加入使用 final ReentrantLock lock = this.lock;, 就会少一个 getfield, 程序会直接从堆栈中取属性的引用, 这样会更快.