1. ホーム
  2. java

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

2023-06-17 09:15:30

質問

ArrayBlockingQueue で、ロックを必要とするすべてのメソッドは、ロックをローカルの final を呼び出す前に 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.lockfinal ?

さらに、ローカルコピーの E[] に作用する前に

private E extract() {
    final E[] items = this.items;
    E x = items[takeIndex];
    items[takeIndex] = null;
    takeIndex = inc(takeIndex);
    --count;
    notFull.signal();
    return x;
}

finalフィールドをローカルのfinal変数にコピーする理由はあるのでしょうか?

どのように解決するのですか?

このクラスの著者であるDoug Leaが好んで使う、極端な最適化です。以下は 最近のスレッド の投稿をご覧ください。

を投稿しています。

...ローカルにコピーすることで最小の バイトコードを生成し、低レベルのコードでは、マシンに少し近いコードを書くのが良い を書くのは良いことです。