解放されない - java 配列 解放




Java並行処理-同じ配列の異なるインデックスへの書き込み (3)

私はデータの配列を持っていると仮定すると、2つのスレッドが同じ配列の異なるインデックスに同時に安全に書き込むことができますか? 私は書き込みのスピードが心配で、私はビットと実際の書き込みとの間に 'get index at write'を同期させたい。

私は2つのスレッドが同じインデックスを取得しないと仮定できるコードを書いています。


2つの異なるスレッドで2つの異なる変数を変更することは安全です。 配列内の2つの異なる要素を変更することは、少なくともOSに関する限り、異なるメモリアドレスの下で2つの異なる変数を変更することと比較することができます。 はい 、安全です。


あなたがarrayListであれば、 CopyOnWriteArrayList見てください。 そのドキュメントから、

ArrayListのスレッドセーフなバリアントで、すべての変更操作(add、setなど)は、基本となる配列の新しいコピーを作成することによって実装されます。

これは通常、コストがかかりますが、トラバーサル操作が突然変異を大幅に上回る場合には、選択肢よりも効率的です。また、トラバーサルを同期できない場合や、並行スレッド間の干渉を防ぐ必要がある場合に便利です。

そして

CopyOnWriteArrayListのインスタンスは、複数の並行読み取りを可能にするList実装として動作し、書き込みは書き込みと同時に発生します。 これを行う方法は、変更されるたびに新しいリストを作成することです。

読み取りはブロックされず、実質的に揮発性読み取りのコストのみを支払う。 書き込みは読み取りをブロックしません(またはその逆)。書き込みは1回だけ実行できます。


配列内の2つの異なるインデックスについては、2つの別々の変数と同じ規則が適用されます。

Java言語仕様の章「スレッドとロック」は、次のように記述されています。

17.4.1共有変数

[...]

すべてのインスタンスフィールド、静的フィールド、配列要素はヒープメモリに格納されます。 この章では、変数という用語を使用して、フィールドと配列要素の両方を参照します

つまり、2つの異なるインデックスに同時に安全に書き込むことができます。 ただし 、コンシューマスレッドがプロデューサスレッドによって書き込まれた最後の値を確認するようにするには、同じインデックスに書き込み/読み取りを同期させる必要があります。





concurrency