0

重複の可能性:
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 フィールドで割り当てられる場合を考慮してください。

4

1 に答える 1

1

ロック変数をローカルにコピーしなくても、コードの正確性に違いはありません。

これを行うことでパフォーマンスが非常にわずかに向上する可能性がありますが、その理由を理解することはできません。それ以外は、作者が読みやすさの改善と見なしたものかもしれません。

于 2012-12-29T14:15:31.650 に答える