在瀏覽java.util.concurrency包的源代碼時,我注意到了我以前從未見過的ReentrantLock的慣用用法:成員RentrantLock變量從未從內部直接訪問一個方法 - 它們總是由局部變量引用引用。在併發包中使用ReentrantLock
樣式#1 e.g從java.util.concurrent.ThreadPoolExecutor中
private final ReentrantLock mainLock = new ReentrantLock();
...
// why a local reference to final mainlock instead of directly using it?
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
...
} finally {
mainLock.unlock();
}
然而,在其它地方的最後成員變量直接使用,無需首先獲得本地參考。
樣式#2例如從Java併發實踐
private final Lock lock = new ReentrantLock();
...
// here the final lock is used directly
lock.lock();
try {
...
} finally {
lock.unlock();
}
我想知道是什麼用風格#1在風格#2的好處是什麼?
感謝
更新
感謝所有的反應,尤其是本Manes認爲對於第一識別性能。 因此我能夠與評論「cache finals across volatiles」
- Doug Lea的介紹這個成語,它是「for performance-critical code like that inside j.u.c.」,雖然「這不是一個推薦做法」,他‘does not discourage it either’
- 布賴恩戈茨(JCIP的作者)也同意,除非它是性能關鍵型應用程序‘don't worry’
據我所知沒有。這是一個「最終」成員,所以沒有必要抓住當地的參考。這可能表明兩個不同的程序員在這些代碼段上工作 - 僅此而已。 – Gray
我看不出有一個理由去接受一個局部變量,除非代碼的以前版本把'mainLock'定義爲非最終的。 – Bringer128
查看此[線程](http://old.nabble.com/Making-copy-of-a-reference-to-ReentrantLock-tt30730392.html#a30733348)以瞭解有關此字節碼優化技巧的詳細信息。 –