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的位置存储的第一个数据。