Hashtableの同時異常挙動
1648 ワード
に質問
HashMapと比較して、Hashtableはスレッドセキュリティのキー値格納セットとして記述されており、マルチスレッド環境に安心して適用できるようである.JDKのHashtableのソースコードを読むと、操作方法にsynchronizedキーワードを追加することでスレッドセキュリティを実現するが、同時異常(throw new ConcurrentModificationException()が発生する可能性がある.エラーが発生したシーン:反復器を使用して、次のコードでこの異常をシミュレートできます.
public static void main(String[] args) throws InterruptedException {
// final Map map = new java.util.HashMap();
final Map map = new java.util.Hashtable();
// final Map map = new java.util.concurrent.ConcurrentHashMap();
for (int i = 0; i < 10; i++) {
map.put(i + "", i);
}
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
map.put("new" + i, "");
}
}
}).start();
Set set = map.entrySet();
for (Object o : set) {
System.out.println(o);
Thread.sleep(100);
}
}
実はjdkソースコードを見て詳しく説明しましたが、反復操作中に同時異常の問題点があります.
ソリューション
HashtableはJDK 1である.0にあるデータ構造クラスは、明らかに古いものがあります.マルチスレッド環境に適用する必要がある場合は、非常に簡単な解決策が必要です.ConcurrentHashMapを使用してください.幸いなことに、それとHashtableはMapインタフェースの実装であり、実装クラスを置き換え、変わらない対外インタフェース(Javaマルチステートの功績)を維持します.
ConcurrentHashMapは、セグメントロックのメカニズムにより、パフォーマンスを向上させ、同時実行をサポートします.マルチスレッド同時、お勧め!
この文は1つの問題の解決に源を発して、修復の経験を総括して、同僚が慎重にプログラミングすることを望んで、穴に入ることを避けます.