0

地図を持っています。まあ言ってみれば:

Map<String, Object> map = new HashMap<String, Object>();

複数のスレッドがこのマップにアクセスしていますが、各スレッドはマップ内の独自のエントリにのみアクセスします。これは、スレッドT1がオブジェクトAをマップに挿入した場合、他のスレッドがオブジェクトAにアクセスしないことが保証されることを意味します。最後に、スレッドT1もオブジェクトAを削除します。

また、スレッドがマップ上で繰り返されないことも保証されています。

このマップは同期する必要がありますか?はいの場合、どのように同期しますか?(ConcurrentHashMap、Collections.synchronizedMap()または同期ブロック)

4

6 に答える 6

4

はい、同期または並行マップが必要になります。マップのサイズについて考えてみてください。2つのスレッドで要素を並列に追加し、両方でサイズを増やすことができます。マップを同期しないと、競合状態が発生し、サイズが正しくなくなる可能性があります。うまくいかない可能性のあるものは他にもたくさんあります。

しかし、スレッドごとに異なるマップを使用することもできますね。

ConcurrentHashMapは通常、同期されたHashMapよりも高速です。ただし、選択は要件によって異なります。

于 2012-11-23T10:18:25.237 に答える
2

スレッドごとにエントリが1つだけで、マップを反復/検索するスレッドがないことが確実な場合、なぜマップが必要なのですか?

ThreadLocal代わりに、スレッド固有のデータを含むオブジェクトを使用できます。文字列とオブジェクトのペアを保持する必要がある場合は、このペア用の特別なクラスを作成して、ThreadLocalフィールド内に保持できます。

class Foo {
   String key;
   Object value;
   ....
}

//below was your Map declaration
//Map<String, Object> map = ...
//Use here ThreadLocal instead
final ThreadLocal<Foo> threadLocalFoo = new ThreadLocal<Foo>();
...
threadLocalFoo.set(new Foo(...));
threadLocalFoo.get() //returns your object
threadLocalFoo.remove() //clears threadLocal container

ThreadLocalsの詳細については、ThreadLocaljavadocsを参照してください

于 2012-11-23T10:22:09.870 に答える
0

-Thread-safe codeまず第一に、すべての条件ではなく、特に上記のような場合に、を書くことは常に習慣です。

- 、、またはのどちらを使用HashTableするのが良いでしょう。synchronized Mapjava.util.concurrent.ConcurrentHashMap<K,V>

于 2012-11-23T10:18:58.453 に答える
0

マップ内の書き込み操作を同期する必要があります。マップを初期化した後、スレッドが新しいエントリを挿入したり、マップ内のエントリを削除したりする予定がない場合は、同期する必要はありません。

ただし、あなたの場合(各スレッドが独自のエントリを持っている場合)、スレッドごとに異なる値を持つ「ローカル」オブジェクトを持つことができるThreadLocalを使用することをお勧めします。

それが役に立てば幸い

于 2012-11-23T10:19:45.503 に答える
0

そうだと思います。データの取得は問題ではなく、データの追加は問題です。

にはHashMap一連のバケット(リスト)があります。にデータを配置するとHashMap、hashCodeを使用してアイテムがどのバケットに入るのかが決定され、アイテムがリストに追加されます。

したがって、2つのアイテムが同時に同じバケットに追加され、実行条件によっては、そのうちの1つだけが効果的に保存される可能性があります。

于 2012-11-23T10:24:34.850 に答える
0

このシナリオでは、Collections.synchronizedMap()または同期ブロック(基本的に同じ)の両方のオーバーヘッドが大きいため、ConcurrentHashMapが最適なマップだと思います。

エントリを挿入し、それらを異なるスレッドで読み取るだけでなく、HashMapの動作方法のために、それらを同期する必要がある場合。

于 2012-11-23T10:28:37.183 に答える