ConcurrentModificationException错误-HashMap是否线程安全,如何实现HashMap的线程安全?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DittyChen/article/details/85064677

      HashMap并非线程安全,多线程使用时,会导致值覆盖,会导致ConcurrentModificationException错误,里边的道道想详细了解的翻翻JDK源码看看。最近项目中遇到了这个问题,才发现了这个,学艺不精啊,毕竟是一个伪安卓开发。。。。流媒体才是主业。

     那么在Java中线程安全的map有没有呢?答案是肯定的,有以下几种方式:

  • HashTable
  • Synchronized Map
  • ConcurrentHashMap

     其中前两种方式是同步加锁的方式,会影响程序运行效率,第三种ConcurrentHashMap是Java 中支持高并发,高吞吐量的hashMap实现。ConcurrnetHashMap是基于线程安全的一个类。曾看到某个帖子http://blog.sina.com.cn/s/blog_605f5b4f0100qsio.html,在针对于Collections.synchronizedMap、ConcurrentHashMap、Hashtable,进行性能测试。模拟1000个并发,每个测试1000次操作,循环测试100轮,最后读写对应的时间分别为:(6544ms,707ms),(5960ms,650ms),(6719ms,713ms)(此数据依据当前运行条件,有浮动,但是得出的结论是,ConcurrentHashMap比其余两个在读和取上都会快一些)。
   为什么ConcurrentHashMap速度快,因为它不是盲目的对map资源枷锁,HashTable是对Map的读写方法进行同步加锁;Synchronized Map是对map资源加锁,而ConcurrentHashMap将内部数据分为多个队列对部分数据更新进行加锁,不影响其它数据的读取(有表述不当的地方,各位可以自己查看Java 源码),貌似是锁段的概念,java7和java8中实现的方式好像有区别,性能更佳了,想了解的可以查看这篇翻译文章根据java7源码分析的-如何在java中使用ConcurrentHashMap

猜你喜欢

转载自blog.csdn.net/DittyChen/article/details/85064677
今日推荐