0

私はとして持ってHashMapいます:

 Map<Integer ,ArrayList<Double>> map1 = new HasMap<Integer,ArrayList<Double>>()

このマップは、いくつかのスレッドによってアクセスおよび変更されます。の各コンポーネントの粒度レベルをスレッド セーフに更新したいと考えていますArrayList。つまり、1 つの値を複数のスレッドで変更できますが、1 つのコンポーネントを複数のスレッドで変更することはできません。どうすればいいですか?これにより、反復中に「未定義のプロパティ」が防止されますか? 値の繰り返し

[編集]

 key      value
 1000    [0.1,0.002,0.8,0.112]

値の各コンポーネントが更新されます。更新中、最初のコンポーネントは 1 つのスレッドによって更新され、2 番目のコンポーネントは別のスレッドによって一度に更新されます。1 つのスレッドだけでペアをロックしたくありません。

4

3 に答える 3

1

あなたが望むのはLockを使うことだと思います。呼び出すlock()と、リソースが他のスレッドによって使用されないように「ロック」し、そのリソースunlock()の更新が完了したときに呼び出して、他のスレッドがそれを変更できるようにします。リソースごとにロックを作成できます。

于 2012-07-21T07:52:09.720 に答える
1

ArrayList の代わりに、a を使用します。CopyOnWriteArrayList これは特にマルチスレッド用に設計されており、ミューテックス/同期を使用するバリアント (のようなVector)よりもはるかに優れたパフォーマンスを発揮します。

Map<Integer ,List<Double>> map1 = new HashMap<Integer, CopyOnWriteArrayList<Double>>();

(ただし、リストへの読み取りよりもはるかに多くの更新を行う場合は注意してください)

コメントによると、アウターは同時に変更されないため、同期は必要ありませんMap

于 2012-07-21T07:52:32.707 に答える
1

ConcurrentHashMapこれで試すことができると思います

于 2012-07-21T07:52:37.090 に答える