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

  • 相关阅读:
    F. Journey
    D. Divide
    C. Counting Pair
    A. A Big Dinner
    E
    D -Sale
    第十三课 历史记录画笔工具
    第十二课 文字工具
    第十一课 模糊工具、海绵工具、仿制图章工具
    第十课 切片工具 修复画笔工具 修补工具 颜色替换工具
  • 原文地址:https://www.cnblogs.com/tianphone/p/10966102.html
Copyright © 2020-2023  润新知