博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ConCurrentHashMap(基于jdk1.8源码)(转载来源https://segmentfault.com/a/1190000014380257)...
阅读量:7193 次
发布时间:2019-06-29

本文共 1045 字,大约阅读时间需要 3 分钟。

ConCurrentHashMap的底层是:散列表+红黑树,与HashMap是一样的。(不允许key和value是null值)

  • JDK1.8底层是散列表+红黑树
  • ConCurrentHashMap支持高并发的访问和更新,它是线程安全
  • 检索操作不用加锁,get方法是非阻塞的
  • key和value都不允许为null
  • 有了Hashtable为啥需要ConCurrentHashMap

    • Hashtable是在每个方法上都加上了Synchronized完成同步,效率低下。
    • ConcurrentHashMap通过在部分加锁利用CAS算法来实现同步。
    • CAS算法和volatile简单介绍

      在看ConCurrentHashMap源码之前,我们来简单讲讲CAS算法和volatile关键字

      CAS(比较与交换,Compare and swap) 是一种有名的无锁算法

      CAS有3个操作数

      • 内存值V
      • 旧的预期值A
      • 要修改的新值B

      当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做

      • 当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值(A和内存值V相同时,将内存值V修改为B),而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试(否则什么都不做)

      看了上面的描述应该就很容易理解了,先比较是否相等,如果相等则替换(CAS算法)

    • volatile经典总结:volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性
  • 小结:
    • 底层结构是散列表(数组+链表)+红黑树,这一点和HashMap是一样的。
    • Hashtable是将所有的方法进行同步,效率低下。而ConcurrentHashMap作为一个高并发的容器,它是通过部分锁定+CAS算法来进行实现线程安全的。CAS算法也可以认为是乐观锁的一种~
    • 在高并发环境下,统计数据(计算size...等等)其实是无意义的,因为在下一时刻size值就变化了。
    • get方法是非阻塞,无锁的。重写Node类,通过volatile修饰next来实现每次获取都是最新设置的值
    • ConcurrentHashMap的key和Value都不能为null
    • 详解参考:https://blog.csdn.net/u010723709/article/details/48007881

转载于:https://www.cnblogs.com/serendipity-fly/p/9334665.html

你可能感兴趣的文章
MapReduce的InputFormat过程的学习
查看>>
ZOJ 3795 Grouping 求最长链序列露点拓扑
查看>>
选择合适的缓动函数
查看>>
【mysql】数据库使用的一些规范
查看>>
JSP内置对象Session
查看>>
Java TCP Swing聊天程序
查看>>
MFC绘制棋盘格
查看>>
关于PYTHON的反射,装饰的练习
查看>>
java用字符写字符
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
查看>>
基于am3358的led跑马灯測试
查看>>
查询系统负载信息 Linux 命令详解
查看>>
菜鸟nginx源代码剖析数据结构篇(一)动态数组ngx_array_t
查看>>
简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)...
查看>>
c#获取带有汉字的字符串长度
查看>>
Iterator、Iterable接口的使用及详解
查看>>
c-大量经典的c算法---ShinePans
查看>>
Spring学习2—Spring容器
查看>>
Atitit.软件硕士 博士课程 一览表 attilax 总结
查看>>
[Hapi.js] Serving static files
查看>>