こんにちは仲間私は私のクラスにグローバルハッシュテーブルを持っており、彼女と一緒に動作する2つのスレッドAとBがあります。AはHashTableから読み取り、BはHashtableに書き込みます。相互排除の問題はありますか?同期する必要がありますか、それともハッシュテーブルクラスは安全ですか?
5 に答える
Hashtable
Map
インターフェイスのスレッドセーフな実装です。
通常のプットアンドゲット操作では、安全になります。ただし、あるスレッドでそれを繰り返し、別のスレッドからその内容を変更すると、ConcurrentModificationException
問題が発生します。したがって、反復するときは、必ず元ののコピーを反復してくださいHashtable
。
代わりに使用する必要があります。これは、インターフェイスConcurrentHashMap
の実装がはるかに優れている/高速です。java.util.Map
Javaコレクションによって提供される同期されたHashMapを使用すると便利です。このクラスは単純なラッパーであり、ハッシュマップをカプセル化します。
Collections.synchronizedMap(new HashMap());
さらなる例の例は、java docsにあります: http : //docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.htmlsynchronizedMap
HashTable
その上で実行されるすべての操作がアトミックであることを保証します。ただし、複数の操作を実行している場合は、synchronize
それらを実行する必要があります。以下の例では、contains
とput
がアトミックであるが、コードにcheck and act
raise条件があるため、これに追加する必要がありますsynchronization
。
if(!hashtable.contains(Object))
{
hashtable.put(key, value);
}
また、チェックするCollections.synchronizedMap()
かConcurrentHashMap
ではなくHashTable
誰もが言うことができることを言っていますが、これはあなたが呼ぶものに関して補足するためだけのものですmutual exclusion
。あなたはそのような問題がないかどうか尋ねています。threadA
スレッドセーフプログラムは、たとえばコードのブロックを使用している場合block1
、スレッドが完了するまで他のスレッドがそれにアクセスしないようにする必要があります。したがって、あなたが何を意味するのかをよく理解していればmutual exclusion
、同じ同期された(スレッドセーフな)共有リソースにアクセスするスレッドは、両方が同時にアクセスできないため、相互に排他的です。提案された安全な実装
の1つを選択した場合、Javaは実際に多くのことを行います。Map
これで、ハッシュテーブル(またはスレッドセーフなmaoが好きなもの)が共有リソースである場合、注意する必要があるのは、発生する前のことだけです。関係。一方のスレッドがデータを読み取り、もう一方のスレッドがデータを書き込んでいるかどうかが重要になります。
詳細については、Java並行性チュートリアルおよびJava並行性パッケージのドキュメントを参照してください。