concurrenthashmap的size方法原理

同上,这也是同一个面试的时候别人问的,我只是记得看过,在concurrenthashmap中会统计多次,当时就说会统计两次进行比较,人家接着问为啥。。。我傻了一下,这不是明摆着两次统计的中间有新的变化了,会导致统计不准确吗?当时也不知道说啥好,以为他有新的点,就说不知道。面试时很多问题其实冷静下来想一下,可以更进一步的,有时候其实也是怕他更进一步后下面的挖坑挖大了。

下面具体说一下这个size方法:
代码就不贴了。只说原理。

众所周知,concurrenthashmap有很多歌segments,首先遍历segments将每个segment的count加起来作为整个concurrenthashMap的size。如果没有并发的情况下这自然就可以了,但这是多线程的,如果前脚统计完后脚有变化了,这就不准确了,源码中引入了,modCount和两次比较来实现size的确认。具体过程是:

1.进行第一遍遍历segments数组,将每个segemnt的count加起来作为总数,期间把每个segment的modCount加起来sum作为结果是否被修改的判断依据。
这里需要提一下modCount,这个是当segment有任何操作都会进行一次增量操作,代表的是对Segment中元素的数量造成影响的操作的次数,这个值只增不减!!!!只增不减很重要,这样就不会出现一个segment+1,导致modcount+1,而另一个segment-1,即modcount-1 ,从而在统计所有的时候modcount没有变化。

2.size操作就是遍历了两次所有的Segments,每次记录Segment的modCount值,然后将两次的modCount进行比较,如果相同,则表示期间没有发生过写入操作,就将原先遍历的结果返回,如果不相同,则把这个过程再重复做一次,如果再不相同,则就需要将所有的Segment都锁住,然后一个一个遍历了。

3.如果经判断发现两次统计出的modCount并不一致,那就如上所说,要重新启用全部segment加锁的方式来进行count的获取和统计了,这样在此期间每个segement都被锁住,无法进行其他操作,统计出的count自然很准确。

而之所以之所以要先不加锁进行判断,道理很明显,就是不希望因为size操作获取这么多锁,因为获取锁不光占用资源,也会影响其他线程对ConcurrentHash的使用,影响并发情况下程序执行的效率。使用锁要谨慎!

原理大概就是这样的,具体的代码可以去看源码,而且源码1.7和1.8有差别。。。有空再贴出来比较比较吧。

安装 Kylinv10 可以通过 QEMU 实现。QEMU 是一个开源虚拟化软件,可模拟不同的处理器架构并在其他操作系统上运行。下面是安装 Kylinv10 的步骤: 1. 首先,确保您已经安装了 QEMU。如果没有安装,可以通过在终端中运行以下命令来安装: ``` sudo apt-get install -y qemu ``` 2. 下载 Kylinv10 镜像文件。您可以从 Kylin 官网或其他可靠源获取镜像文件。将下载的镜像文件保存到您的计算机上的任意位置。 3. 打开终端并导航到保存 Kylinv10 镜像文件的目录。 4. 运行以下命令以将虚拟机创建在 QEMU 中: ``` qemu-system-x86_64 -m 2G -hda kylinv10.img -boot d -cdrom kylinv10.iso -enable-kvm ``` 这将启动 QEMU 并创建一个具有 2GB 内存的虚拟机。其中,`kylinv10.img` 是您下载的 Kylinv10 镜像文件的名称,`kylinv10.iso` 是您下载的 Kylinv10 安装文件的名称。 5. 安装过程将开始,并通过 QEMU 模拟的虚拟计算机的界面进行。按照屏幕上的安装向导的指示进行操作以完成 Kylinv10安装。 6.安装完成后,您可以使用 QEMU 运行和访问 Kylinv10。保留终端打开,并返回到第 4 步的命令行。通过按下 Ctrl+Alt+G,将鼠标从虚拟机释放并在 Linux 主机和 Kylinv10 之间切换。 QEMU 可以提供一个没有使用物理设备的完整虚拟环境,使您能够在不影响主机操作系统的情况下测试和运行 Kylinv10。希望这些步骤能帮助您成功安装 Kylinv10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值