vultr怎么建设影视网站,网站建设名列前茅,ip加端口可以做网站吗,网络设计是做什么的文章底部有个人公众号#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享#xff1f; 踩过的坑没必要让别人在再踩#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官#xff1a;ConcurrentHashMap是怎么… 文章底部有个人公众号热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享 踩过的坑没必要让别人在再踩自己复盘也能加深记忆。利己利人、所谓双赢。 面试官ConcurrentHashMap是怎么分段分组的
参考答案
get操作
Segment的get操作实现非常简单和高效先经过一次再散列然后使用这个散列值通过散列运算定位到 Segment再通过散列算法定位到元素。get操作的高效之处在于整个get过程都不需要加锁除非读到空的值才会加锁重读。原因就是将使用的共享变量定义成 volatile 类型。
put操作
当执行put操作时会经历两个步骤 1、判断是否需要扩容 2、定位到添加元素的位置将其放入 HashEntry 数组中。
插入过程会进行第一次 key 的 hash 来定位 Segment 的位置如果该 Segment 还没有初始化即通过 CAS 操作进行赋值然后进行第二次 hash 操作找到相应的 HashEntry 的位置这里会利用继承过来的锁的特性在将数据插入指定的 HashEntry 位置时尾插法会通过继承 ReentrantLock 的 tryLock() 方法尝试去获取锁如果获取成功就直接插入相应的位置如果已经有线程获取该Segment的锁那当前线程会以自旋的方式去继续的调用 tryLock() 方法去获取锁超过指定次数就挂起等待唤醒。