任意给定一个正整数N(N<=100)计算2的N次方的值。
输入只有一个正整数N
任意给定一个正整数N(N<=100)计算2的N次方的值。
输入只有一个正整数N
最近在框架中有一个判断使用嘚是位判断,据说会快点哦哈哈。
结果给出一个数,我的妈啊这是2的几次方啊,需要拿着计算器在那边计算吗。
于是有一个想法使用来判断这个数是N的M次方法
* 这里使用位的移动来计算2的N次方法
(1)理解HashMap的数据结构的设计囷实现思路
(2)在(1)的基础上理解ConcurrentHashMap的并发安全的设计和实现思路
前面的文章已经介绍过Map结构的底层实现,这里我们重点放在其扩容方法 这里分别对JDK7和JDK8版本的HashMap+ConcurrentHashMap来分析:
这个版本的HashMap数据结构还是数组+链表的方式,扩容方法如下:
(1)对于get读操作如果当前节点有数据,还没迁移完成此时不影响读,能够正常进行
如果当前链表已经迁移完成,那么頭节点会被设置成fwd节点此时get线程会帮助扩容。
(2)对于put/remove写操作如果当前链表已经迁移完成,那么头节点会被设置成fwd节点此时写线程会帮助扩容,如果扩容没有完成当前链表的头节点会被锁住,所以写线程会被阻塞直到扩容完成。
volatile修饰的数组引用是强可见的但是其元素却不一定,所以这导致size的根据sumCount的方法并不准确。
同理Iteritor的迭代器也一样并不能准确反映最新的实际情况
本文主要了介绍了HashMap+ConcurrentHashMap的扩容策略,扩容的原理是新生成大于原来1倍大小的数组然后拷贝旧数组数据到新的数组里媔,在多线程情况下这里面如果注意线程安全问题,在解决安全问题的同时我们也要关注其效率,这才是并发容器类的最出色的地方