コピーオンライトコンテナのJAVA



Java Copy Write Container



実際の開発、多くのデータ構造、そして多くの場合、読み取りと書き込みが少なくなっています。マルチスレッドでは、読み取り操作はデータを変更せず、同時読み取りもスレッドセーフにも影響しません。重要な考慮事項は同時書き込みであるため、スレッドの読み取りとマルチスレッドスレッドの書き込みを分離すると効率が向上します。

JDK1.5以降、コピーオンライトの原則、つまりコピーオンライトがありました。核となる考え方は、データコンテナーを使用するスレッドがある場合、それが書き込まれている場合は、新しいコンテナーをコピーして、新しいコンテナー内のデータを変更してから、新しいコンテナーへの参照ポイントを作成することです。通常の読み取り操作が読み取りデータアドレス参照容器である場合。下部のcopyOf()メソッドを使用して、コンテナの新しいコピーを取得することに注意してください。これは、ディープコピーメソッドです。つまり、新しいコンテナは、ヒープメモリ領域内の新しいオブジェクトであり、独自のオブジェクトを持っていますが、動作しません。新しいコンテナ古いコンテナの影響を受けます。もちろん、これによりメモリのオーバーヘッドが増加します。したがって、レプリケーションによってロックも追加された場合、そうでない場合は、メモリを占有するマルチスレッドの複数のオブジェクトがレプリケートされ、簡単にOOMにつながる可能性があります。



JAVAパッケージは、コンテナの2つの同時コピーオンライト原則、つまりcopyOnWriteArrayListとcopyOnWriteArraySetを提供します。 copyOnWriteArraySetは実際にcopyOnWriteArrayListによって実現され、その基になるオブジェクトにはcopyOnWriteArrayListがあり、ロジックの増加は重複要素を許可しません。2つの要素を追加するための追加のaddIfAbsent()およびaddAllAbsent()メソッドを提供します。基になるcopyOnWriteArrayListの焦点を要約したいと思います。実装。

どのadd()メソッド、つまり、copyOfを書き込んでから、元の参照ポイントを新しい配列に書き込むことによる、新しい配列のディープコピーの書き込み操作()メソッド。同時に、複数のスレッドが同時に複数のオブジェクトを作成してメモリを占有するのを防ぐために、ロックを追加しました。



そのget()メソッドは、ロックされた読み取り操作ではないため、データの整合性はリアルタイムのマルチスレッドを保証できません。



ブラックリスト、ホワイトリストのデータ構造など、より少ないアプリケーションの読み取りと書き込みなど、簡単なアプリケーションシナリオの原則の多くをコピーオンライトで実行できますが、バッチ書き込みをより効率的に行うこともできます。

しかし、copy-on-writerコンテナの欠点も明らかです。これが前述の要約です。1つ目はディープコピーによってメモリオーバーヘッドが増加し、2つ目は最終的にデータの整合性を確保するためだけであり、データの整合性の実装を保証することはできません。書き込まれたデータは必ずしもすぐに読み取られるとは限りません。住所変更する時間がなかった可能性があります。

2番目の欠点として、ReadWriteLock、ReentrantReadWriteLock StampedLockなど、読み取り/書き込みロックを使用してコントラクトを改善することができます。 ReentrantReadWriteLockは、再入力ロックメカニズムを備えたReadWriteLock用に最適化されています。制御する2つの異なるロックを介した2つの読み取りおよび書き込み操作、および書き込みロックがロックされている場合、読み取りロックを取得できません。つまり、書き込み時に読み取りを行わないため、読み取りと書き込みの両方で分離を実現し、実際の時間データの整合性。 StampedLockは、読み取り操作、つまり読み取りロックをロックする前の読み取り操作用に最適化されており、データが変更されているかどうかを判断し、データが変更されている場合は再度読み取り、変更されていない場合は読み取りロックを取得します。商品の結果を直接読み戻そうとすると、読み取りロックを取得できず、効率が大幅に向上します。

要約すると、ReentrantReadWriteLockの読み取りおよび書き込み操作がロックに追加されますが、読み取りはコンテナーのコピーオンライトよりも遅くなりますが、リアルタイムのデータ整合性を保証できます。書き込み操作は読み取り操作よりも遅いため、分離せずに従来のロックよりも読み取り効率が高くなります。 StampedLockの読み取り操作は、コピーオンライトのロックフリーコンテナ操作に非常に近く、迅速で、リアルタイムで一貫したデータを保証します。