hashmap与currentHashMap
hashmap的缺点
多线程不安全,在并发场景下使用时容易出现死循环,脏读问题等
死循环:https://juejin.im/post/5a66a08d5188253dc3321da0
(这篇好点)https://blog.csdn.net/justloveyou_/article/details/72783008
脏读:https://blog.csdn.net/qq_33591903/article/details/81672260
currrntHashMap的改进
由于扩容是按照2的幂次方进行的,所以扩展前在同一个桶中的元素,现在要么还是在原来的序号的桶里,或者就是原来的序号再加上一个2的幂次方,就这两种选择。
其中抛弃了JDK1.7的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。
CAS与synchronized :https://juejin.im/post/5c37377351882525ec200f9e
CAS(乐观锁)比synchronized(悲观锁)轻量级一点,消耗的资源比较小。
CAS 是 compare and swap 的简写,即比较并交换。它是指一种操作机制,而不是某个具体的类或方法。在 Java 平台上对这种操作进行了包装。在 Unsafe 类中,调用代码如下:
unsafe.compareAndSwapInt(this, valueOffset, expect, update);
复制代码它需要三个参数,分别是内存位置 V,旧的预期值 A 和新的值 B。操作时,先从内存位置读取到值,然后和预期值A比较。如果相等,则将此内存位置的值改为新值 B,返回 true。如果不相等,说明和其他线程冲突了,则不做任何改变,返回 false。
这种机制在不阻塞其他线程的情况下避免了并发冲突,比独占锁的性能高很多。 CAS 在 Java 的原子类和并发包中有大量使用。
最新文章
- JavaScript -Array.form方法
- Permutation test: p, CI, CI of P 置换检验相关统计量的计算
- 转载:Tomcat的JVM设置和连接数设置
- WLAN频段的选择
- 如何优化cocos2d程序的内存使用和程序大小
- javascript之简单的选择排序法
- 【Java】聊聊常用的非对称加密算法之一RSA的使用(Java)
- TOMOYO Linux(undone)
- linux服务之nfs
- Java之--Java基础知识
- 关于本地$.get(url,function(data)),异步获取数据
- springmvc继承activemq(原创)
- [Swift]LeetCode128. 最长连续序列 | Longest Consecutive Sequence
- matplotlib中的plt.ion()和plt.ioff()函数
- Thread类中start()方法喝run()方法有什么不同?
- HTTP之referrer
- spring 配置ibatis和自动分页
- 在windows下安装Jupyter Notebook的安装和使用
- shell脚本简单实例
- django新建项目,连接mysql数据库