ConCurrentHashMap(基于jdk1.8源码)(转载来源https://segmentfault.com/a/1190000014380257)
2024-09-01 10:09:03
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
最新文章
- json简单使用
- css中各种情况下的元素的垂直和水平居中的问题
- 修改BIND9实现TCP DNS
- yii2 rbac权限控制详细操作步骤
- Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tool
- VS2015 企业版不支持 JavaScript 语法高亮、智能提醒
- 二叉排序树(BST)构造与应用
- Windows 2012安装odoo12
- [Swift]LeetCode599. 两个列表的最小索引总和 | Minimum Index Sum of Two Lists
- 转载:如何优雅的实现INotifyPropertyChanged接口
- vue mand-mobile ui加class不起作用的问题 css权重问题
- linux文本格式转换
- Linux /etc/profile文件详解
- nginx 读取文件 permission denied
- Android学习之Gallery
- PHP面向对象__set(赋值方法)
- size_t详细解释
- 【权值分块】bzoj3570 DZY Loves Physics I
- poj_1284_原根
- Log4j介绍,log4j.properties配置详解
热门文章
- P2050 [NOI2012]美食节 动态连边优化费用流
- Codeforces Round #486 (Div. 3)988D. Points and Powers of Two
- css绝对定位
- 仿QQ5.0侧滑菜单
- iOS面试题整理带答案
- Java第二次作业第四题
- MySQL索引&;&;开发规范
- 手把手教你使用Java实现一个神经网络
- RocksDB线程局部缓存
- 生成式学习算法(三)之----高斯判别分析模型(Gaussian Discriminant Analysis ,GDA)