0

ArrayBlockingQueue のソース コードを読んでいるときに、以下のコードを見つけました。

public E take() throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        try {
            while (count == 0)
                notEmpty.await();
        } catch (InterruptedException ie) {
            notEmpty.signal(); // propagate to non-interrupted thread
            throw ie;
        }
        E x = extract();
        return x;
    } finally {
        lock.unlock();
    }
}

コードを使用しない理由

public E take() throws InterruptedException {
     lock.lockInterruptibly();
    try {
        try {
            while (count == 0)
                notEmpty.await();
        } catch (InterruptedException ie) {
            notEmpty.signal(); // propagate to non-interrupted thread
            throw ie;
        }
        E x = extract();
        return x;
    } finally {
        lock.unlock();
    }
}

行コードの利点は何ですか: final ReentrantLock lock = this.lock;

4

1 に答える 1

0

このアイデアは Doug Lea によって広められました。元のアイデアは、最終的なローカル変数が使用されたときに JVM がパフォーマンス関連の最適化を実行できる可能性があるというものだったと思います。

この質問について議論している OpenJDK スレッドからこのスレッドをチェックしてください

編集:

ちょっとした調査で、スタックに関する次の 2 つの関連する質問が投げかけられました。

ArrayBlockingQueue で、最終メンバ フィールドをローカル最終変数にコピーするのはなぜですか?

使用前の Java Lock 変数の割り当て。なんで?

于 2013-04-13T13:35:45.047 に答える