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つの問題の解決に源を発して、修復の経験を総括して、同僚が慎重にプログラミングすることを望んで、穴に入ることを避けます.