简单认识HashMap->ConcurrentHashMap

HashMap->ConcurrentHashMap

简单认识
什么是hash呢?
就是把任意长度的输入,通过散列算法换成固定长度的输出。

常用的hash函数:
直接取余法,乘法取整法,平方取中法。

hash冲突怎么解决呢?
开放寻址,在散列,连地址法,常见的有MD5,SHA-1,不可逆。
不安全,撞库可以找到,加密加盐值。

HashMap
大家都是hashMap是不安全的,但是它为什么不是安全的呢?

hashMap的一次扩容,取当前table的2倍作为新table的大小。在多线程的场景下,一个线程在执行中被挂起,一个线程完成了扩容。这时第一个线程又被唤起,执行后面的扩容动作。因为是头插法,next的引用会形成循环引用,造成死循环。
当去get一个不存在元素的时候会产生死循环。

JDK1.7中的ConcurrentHashMap中的实现
除了常见的get,put方法之外,还添加了putIfAbsent方法。putIfAbsent时,有这个key,返回这个key对应的值,没有的话,添加返回null。

segment[],segment,其实就是个可重入锁。
一个segment中,对应一个hashEntry[]。
一旦初始化ConcurrentHashMap之后,segment[]数组大小固定,扩容的其实是hashEntry[]数组。segment[],hashEntry[]的数组大小,都是对应的初始值的最小2的N次方。
get方法
没有加锁,为什么还能保证线程是安全的呢?
ConcurrentHashMap的里面的元素值,都添加了volidate的属性值,保证线程之间的可见性。
一个key怎么两次hash定位到值呢?
高位定位到是哪个segment,全部定位hashentry中的位置。

后续put,以及ConcurrentHashMap在JDK1.8中的特性,实现是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

張義帥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值