ArrayBlockingQueue で Final メンバー フィールドをローカル Final 変数にコピーする理由
ArrayBlockingQueue では、ロックを必要とするメソッドがそれをローカル Final 変数にコピーしますlock() を呼び出す前に。たとえば、offer メソッドでは:
public boolean offer(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { if (count == items.length) return false; else { insert(e); return true; } } finally { lock.unlock(); } }
さらに、extract メソッドでは items 配列のローカル コピーが使用されます:
private E extract() { final E[] items = this.items; E x = items[takeIndex]; items[takeIndex] = null; takeIndex = inc(takeIndex); --count; notFull.signal(); return x; }
これらの最終フィールドがローカル変数にコピーされるのはなぜですか?
の最適化同時実行性
ArrayBlockingQueue の作者である Doug Lea 氏によると、最終フィールドをローカルにコピーするのは、バイトコード サイズを削減するための最適化です。低レベルのコードでは、マシンに近いコードを記述することが有益です。
最後のフィールドをコピーすることにより、コンパイラーはより小さなバイトコードを生成し、同時環境でのパフォーマンスが向上します。ローカル変数を介して Final フィールドにアクセスすると、特に複数のスレッドが同じ共有メモリにアクセスする可能性のある同時実行性の高いシナリオでは、インスタンスから直接アクセスするよりも高速になる可能性があります。
パフォーマンスの利点
ArrayBlockingQueue は、final メンバー フィールドをローカルの Final 変数にコピーすることで、パフォーマンスと同時実行性を最適化します。この最適化は微妙かもしれませんが、高レベルの同時実行性が関係する状況では顕著な違いを生む可能性があります。
最終フィールドをローカルにコピーすることは、すべての状況で普遍的なベスト プラクティスではない可能性がありますが、 ArrayBlockingQueue は、特に同時環境でのパフォーマンスを向上させるために意図的に設計された選択です。
以上が「ArrayBlockingQueue」が Final メンバー フィールドをローカル Final 変数にコピーするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。