java中hashmap和concurrenthashmap的区别有哪些

  介绍

小编给大家分享一下java中hashmap和concurrenthashmap的区别有哪些,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

区别:hashmap是线程不安全的,当出现多线程操作时,会出现安全隐患;而concurrenthashmap是线程安全的.HashMap不支持并发操作,没有同步方法;concurrenthashmap支持并发操作。

<强> hashmap和concurrenthashmap的区别

<李>

hashmap是线程不安全的,当出现多线程操作时,会出现安全隐患;而concurrenthashmap是线程安全的。

<李>

hashmap不支持并发操作,没有同步方法,concurrenthashmap支持并发操作,通过继承ReentrantLock (JDK1.7重入锁)/ca和同步(JDK1.8内置锁)来进行加锁(分段锁),每次需要加锁的操作锁住的是一个段,这样只要保证每个段是线程安全的,也就实现了全局的线程安全。

concurrenthashmap采用锁分段技术,将整个散列桶进行了分段段,也就是将这个大的数组分成了几个小的片段段,而且每个小的片段段上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段段,然后再在这个片段上面进行插入,而且这里还需要获取段锁。

concurrenthashmap让锁的粒度更精细一些,并发性能更好。

<强> hashmap

hashmap是线程不安全的,在原码中对把方法没有做锁的处理,当放生多线程时,会有线程安全问题,下面通过一个简单的例子进行演示,创建三个线程,并且启动,在运行方法里通过对循环给地图存100个值,然后输出地图的大小按正常来说,该地图的大小应该是100年,而这里输出了176 .

class  Demo  implements  Runnable {   ,,,static  Map<字符串,String>, map =, new  HashMap<在();      ,,@Override   ,,,public  void 运行(),{   ,,,,,,,for  (int 小姐:=,0;,小姐:& lt;, 100;,小姐:+ +),{   ,,,,,,,,,,,map.put(小姐:+,““,“value");   ,,,,,,,}   ,,,}      ,,,public  static  void  main (String [], args), {      ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,//,获取当前线程   ,,,,,,,Thread  currentThread =, Thread.currentThread ();   ,,,,,,,//,当前线程睡眠2秒,让上面的三个线程先执行   ,,,,,,,try  {   ,,,,,,,,,,,currentThread.sleep (2000);   ,,,,,,,},catch  (Exception  e), {   ,,,,,,,,,,,e.getMessage ();   ,,,,,,,}   ,,,,,,,//,上面的线程执行完毕后输出地图的大小   ,,,,,,,System.out.println (map.size ());   ,,,}   }

癹ava中hashmap和concurrenthashmap的区别有哪些"

<强> HashTable

HashTable用到了锁,而且是直接给把方法加的锁,线程肯定是安全的了,这里我们在测试线程安全的同时,看一下执行时间,这里通过put10000个数据进行测试,通过结果可以看的到,地图的大小确实是10000年,而时间用了16个女士左右。

癹ava中hashmap和concurrenthashmap的区别有哪些"

class  Demo  implements  Runnable {   ,,,static  Map<字符串,String>, map =, new  Hashtable<在();      ,,@Override   ,,,public  void 运行(),{   ,,,,,,,long  startTime =, System.currentTimeMillis();,//获取开始时间   ,,,,,,,for  (int 小姐:=,0;,小姐:& lt;, 10000;,小姐:+ +),{   ,,,,,,,,,,,map.put(小姐:+,““,“value");   ,,,,,,,}   ,,,,,,,long  endTime =, System.currentTimeMillis();,//获取结束时间   ,,,,,,,System.out.println ((endTime 背后,开始时间),+,“ms");   ,,,}      ,,,public  static  void  main (String [], args), {      ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,new 线程(new 演示()).start ();   ,,,,,,,//,获取当前线程   ,,,,,,,Thread  currentThread =, Thread.currentThread ();   ,,,,,,,//,当前线程睡眠2秒,让上面的三个线程先执行   ,,,,,,,try  {   ,,,,,,,,,,,currentThread.sleep (2000);   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

java中hashmap和concurrenthashmap的区别有哪些