ホームページ >Java >&#&ベース >ハッシュマップと同時ハッシュマップの違いは何ですか

ハッシュマップと同時ハッシュマップの違いは何ですか

青灯夜游
青灯夜游オリジナル
2021-02-02 11:14:1812648ブラウズ

違い: HashMap はスレッドセーフではありません。マルチスレッド操作が発生すると、セキュリティ上のリスクが発生する可能性がありますが、ConcurrentHashMap はスレッドセーフです。 HashMap は同時操作をサポートしておらず、同期方法もありません。ConcurrentHashMap は同時操作をサポートします。

ハッシュマップと同時ハッシュマップの違いは何ですか

#このチュートリアルの動作環境: Windows7 システム、Java10 バージョン、DELL G3 コンピューター。

ハッシュマップとコンカレントハッシュマップの違い

  • HashMap はスレッド安全ではありません。マルチスレッド操作が発生するとセキュリティ リスクが発生しますが、ConcurrentHashMap はスレッド安全ではありません。スレッドセーフです。

  • HashMap は同時操作をサポートしておらず、同期メソッドもありません。ConcurrentHashMap は ReentrantLock (JDK1.7 リエントラント ロック)/CAS を継承し、同期 (JDK1.8 組み込みロック) することで同時操作をサポートします。 ) ロック (セグメント ロック) の場合、ロックが必要な各操作がセグメントをロックするため、各セグメントがスレッド セーフである限り、グローバル スレッド セーフが実現されます。

ConcurrentHashMap は、ロック セグメンテーション テクノロジを使用してハッシュ バケット全体をセグメント化します。つまり、この大きな配列はいくつかの小さなセグメントに分割され、それぞれの小さなセグメントにはロックが存在します。要素を挿入するときは、最初に挿入するセグメントを見つけてから、このセグメントに挿入する必要があります。また、ここでセグメント ロックを取得する必要もあります。

ConcurrentHashMap により、ロックの粒度がより細かくなり、同時実行パフォーマンスが向上します。

(推奨チュートリアル:

java 入門チュートリアル)

HashMap

HashMap はスレッド安全ではありません。put メソッドはスレッド安全ではありません。ハンドル ロック。複数のスレッドが解放されると、スレッドの安全性の問題が発生します。これを示す簡単な例を示します。3 つのスレッドが作成され、開始されます。run メソッドでは、for ループを通じて 100 個の値がマップに保存されます。を入力し、マップのサイズを出力します。通常、マップのサイズは 100 になるはずですが、ここでは 176 が出力されます。

class Demo implements Runnable{
    static Map<String,String> map = new HashMap<>();

    @Override
    public void run() {
        for (int i = 0; i < 100; i ++) {
            map.put(i + "","value");
        }
    }

    public static void main(String[] args) {

        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        // 获取当前线程
        Thread currentThread = Thread.currentThread();
        // 当前线程睡眠2秒,让上面的三个线程先执行
        try {
            currentThread.sleep(2000);
        } catch (Exception e) {
            e.getMessage();
        }
        // 上面的线程执行完毕后输出map的大小
        System.out.println(map.size());
    }
}

ハッシュマップと同時ハッシュマップの違いは何ですか

HashTable

HashTable はロックを使用しており、そのロックは put メソッドに直接追加されます。スレッドは間違いなく安全です。 . , ここでは実行時間を確認しながらスレッド セーフティをテストしています。ここではテスト用のデータを 10000 個入れています。結果から、マップのサイズは確かに 10000 で、時間は約 16ms かかっていることがわかります。

ハッシュマップと同時ハッシュマップの違いは何ですか

class Demo implements Runnable{
    static Map<String,String> map = new Hashtable<>();

    @Override
    public void run() {
        long startTime = System.currentTimeMillis(); //获取开始时间
        for (int i = 0; i < 10000; i ++) {
            map.put(i + "","value");
        }
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println((endTime - startTime) + "ms");
    }

    public static void main(String[] args) {

        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        // 获取当前线程
        Thread currentThread = Thread.currentThread();
        // 当前线程睡眠2秒,让上面的三个线程先执行
        try {
            currentThread.sleep(2000);
        } catch (Exception e) {
            e.getMessage();
        }
        // 上面的线程执行完毕后输出map的大小
        System.out.println(map.size());
    }
}

ハッシュマップと同時ハッシュマップの違いは何ですか

ConcurrentHashMap

ConcurrentHashMap はセグメンテーション ロックを使用していますが、どのブロックが安全ではありません。どのブロックをロックするだけです。一部、ロックを解除したままにできない場合、またはすべてをロックできない場合は、ロックします。このブロック ロックがメソッド ロックより速いか遅いかを確認します。

#

class Demo implements Runnable{
    static Map<String,String> map = new ConcurrentHashMap<>();

    @Override
    public void run() {
        long startTime = System.currentTimeMillis(); //获取开始时间
        for (int i = 0; i < 10000; i ++) {
            map.put(i + "","value");
        }
        long endTime = System.currentTimeMillis(); //获取结束时间
        System.out.println((endTime - startTime) + "ms");
    }

    public static void main(String[] args) {

        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        new Thread(new Demo()).start();
        // 获取当前线程
        Thread currentThread = Thread.currentThread();
        // 当前线程睡眠2秒,让上面的三个线程先执行
        try {
            currentThread.sleep(2000);
        } catch (Exception e) {
            e.getMessage();
        }
        // 上面的线程执行完毕后输出map的大小
        System.out.println(map.size());
    }
}
ハッシュマップと同時ハッシュマップの違いは何ですか

ハッシュマップと同時ハッシュマップの違いは何ですか結果から、以前の 20ms と 22ms から現在の 17ms と 18ms## に改善されていることがわかります。

# コンピューター プログラミング関連の知識については、

プログラミング ビデオ

をご覧ください。 !

以上がハッシュマップと同時ハッシュマップの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。