在中ArrayBlockingQueue,所有需要锁定的方法都将final在调用之前将其复制到局部变量lock()。
ArrayBlockingQueue
lock()
public boolean offer(E e) { if (e == null) throw new NullPointerException(); final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } }
没有任何理由复制this.lock到一个局部变量lock时,现场this.lock的final?
this.lock
lock
final
此外,E[]在执行操作之前,它还会使用的本地副本:
E[]
private E extract() { final E[] items = this.items; E x = items[takeIndex]; items[takeIndex] = null; takeIndex = inc(takeIndex); --count; notFull.signal(); return x; }
有什么理由将最终字段复制到本地最终变量?
该类的作者Doug Lea喜欢使用这种极端的优化方法。这是有关core-libs-dev邮件列表的最新主题的帖子,有关这个确切的主题,可以很好地回答您的问题。
从帖子中:
…复制到本地会产生最小的字节码,对于低级代码,最好编写离机器更近的代码