AtomicIntegerArray,提供了一个原子访问数据中元素方法的一种途径
对于这类原子操作,在理解上应该没什么问题,通过AtomitoIntegerArray,我学到如下几个关键点:
1)int sacle = unsafe.arrayIndexScale(int[].class)与 int base = unsafe.arrayBaseOffset(Int[].class); 其中 unsafe.arrayBaseOffset 获取该类型的数组,在对象存储时,存放第一个元素的内存地址,相对于数组对象起始地址的内存偏移量。 unsafe.arrayIndexSacle(int[].class) 获取该类型的数组中元素的大小,占用多少个字节。
2) 根据scale ,base 如何准备定位到任意一个下标的地址呢?请查看如下关键代码块

用于定位元素偏移量的控制值 举例说明,int scale = 4;1个int类型,在java中占用4个字节。 Integer.numberOfLeadingZeros(scale); 返回 scale 高位连续0的个数,得出shift = 2, 而shift在如下方法使用 得出结论了吧,shift就是 用来定位数组中的内存位置,用来移位用的,每向左移动移位,在不越界的情况下,想当于乘以2。也就是int类型的长度为4,也就是第0个位置是0,第1(i)个位置是4,,第二个(i)位置是8,也就是偏移位置等于 i * 4,也就是 i << 2;总结出一个乘法转换成移位操作的案例: a * (一个2的幂(n)的数) = a << n; 给出一个指定2的幂的数,怎么算成n,,参照shift的计算方法。
原文:http://blog.csdn.net/prestigeding/article/details/52980801