重複の可能性:
ArrayBlockingQueue で、最終メンバー フィールドをローカルの最終変数にコピーするのはなぜですか?
java.util.concurrent.DelayQueue の実装を見ると、よくわからないパターンが見えます。
public class DelayQueue<E extends Delayed> extends AbstractQueue<E>
implements BlockingQueue<E> {
private transient final ReentrantLock lock = new ReentrantLock();
private transient final Condition available = lock.newCondition();
private final PriorityQueue<E> q = new PriorityQueue<E>();
public boolean offer(E e) {
**final ReentrantLock lock = this.lock;**//(*)
lock.lock();
try { ... }
finally {lock.unlock();}
}
public E poll() {
**final ReentrantLock lock = this.lock**;//(*)
lock.lock();
try { ... }
finally {lock.unlock();}
}}
(*) 行 (フィールドへの一時参照を操作するため) の目的は何ですか? これは、同時実行 (ロック) が関係する BlockingQueue インターフェースのメソッドの実装に見られますか? ロック フィールドが final であり、フィールドの初期化中に他の final フィールドで割り当てられる場合を考慮してください。