#このチュートリアルの動作環境: Windows7 システム、Java10 バージョン、DELL G3 コンピューター。違い: HashMap はスレッドセーフではありません。マルチスレッド操作が発生すると、セキュリティ上のリスクが発生する可能性がありますが、ConcurrentHashMap はスレッドセーフです。 HashMap は同時操作をサポートしておらず、同期方法もありません。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 サイトの他の関連記事を参照してください。