vector个人理解

无锁的vector是LockFreeVector
内部是二维数组,类型是AtomicReferenceArray类型。
第一维的数组大小是30,第二维第一个大小是8,第二个大小是16,所以整个二维数组的大小是整体之和,大概80亿。
看了《实战java高并发程序设计》中关于push_back的介绍,
要注意数组大小和数组存储位置的区别。比如第一个数组的大小是8,二进制是1000,而数组的存储是从0000-0111的。
但是每次看其实还是会懵逼,最主要的是抓住两点,数据存储需要定位两点,即一维数组中的位置和二维数组中的位置。
一维数组中的位置,因为每个二维数组的大小都是8的倍数,因此在定位是,只要加上8即可知道。此处是通过前导零的个数来算的,而此处就要注意刚才说的储存大小和存储位置的点
二维数组的位置,就算的脑洞就有点大了,主要是下面两句实现的
//desc.size 目前数组的大小
//FIRST_BUCKET_SIZE 值为8
int pos = desc.size + FIRST_BUCKET_SIZE;
//zeroNumPos 是前导零的个数
//^ 这个是异或运算, 0^1=1
int idx = (0x80000000 >>> zeroNumPos ) ^ pos;
idx就是二维数组中的位置
此处就是脑洞处,比如初始大小是0,存入第一个数时,pos就是8,而通过异或计算idx的值就是0,即在0的位置存储的第一个数据。

转载于:https://www.cnblogs.com/tianphone/p/10966102.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值