にアクセスする 2 つのスレッド t1 と t2 がありArrayList
ます。
同じインデックスで読み取りと書き込みを行っていない限り、スレッドがアクセスできるようにします。
Java 5の同時APIとコレクションを使用せずにどうすればよいですか?
にアクセスする 2 つのスレッド t1 と t2 がありArrayList
ます。
同じインデックスで読み取りと書き込みを行っていない限り、スレッドがアクセスできるようにします。
Java 5の同時APIとコレクションを使用せずにどうすればよいですか?
正しいプログラムでは、可変オブジェクトを複数のスレッド間で共有したり、同期を使用したりすることはできません。アプリケーションが何をするかを知らずに、役に立つ答えを見つけるのは困難です。たぶん、スレッド間で分割してArrayList
、それぞれが独自のバージョンで動作し、後で結果を連結できるようにすることができます。または、生産者と消費者のシナリオを実装している場合は、いくつかの Java モニターと の既製の実装を廃止することができますArrayList
。
A. ArrayList のロック時間を短縮する
ために、データ構造を ArrayList のマップ (たとえば、10 エントリのマップ) に変更します (アクセスを実行するには、オブジェクトの hashCode() % 10 を使用します)。各マップ エントリの ArrayListは
同期されます (Collections.synchronizedList B を使用して、その同期バージョンを取得でき
ます。アプリケーションをより適切にロックするには、ReaderWriterLock を使用します。これを使用して、ArrayList を使用するシナリオに進み、読み取り用にロックする必要があるか、書き込み用にロックする必要があるかを理解する必要があります
C. A と B を組み合わせる
ただし、多くの場合 (適切な同期戦略はユース ケースに依存します)、書き込みよりも読み取りの方が多いと予想されますか? そうであれば、ReaderWriterLock を使用してください。そうでない場合は、Rw ロックが役に立たない可能性があります。
役に立ちませんか - Collections.synchronizedListクラス。
2 つのスレッドが同時に同じインデックスにアクセスしない場合でも、Array が再割り当てされると問題が発生する可能性があります。ArrayList.ensureCapacity