AtomicIntegerArray,提供了一個原子訪問數(shù)據(jù)中元素方法的一種途徑
對于這類原子操作,在理解上應該沒什么問題,通過AtomitoIntegerArray,我學到如下幾個關鍵點:
?1)int sacle = unsafe.arrayIndexScale(int[].class)與 int base = unsafe.arrayBaseOffset(Int[].class); 其中 unsafe.arrayBaseOffset 獲取該類型的數(shù)組,在對象存儲時,存放第一個元素的內存地址,相對于數(shù)組對象起始地址的內存偏移量。 unsafe.arrayIndexSacle(int[].class) 獲取該類型的數(shù)組中元素的大小,占用多少個字節(jié)。
?2) 根據(jù)scale ,base 如何準備定位到任意一個下標的地址呢?請查看如下關鍵代碼塊

用于定位元素偏移量的控制值 舉例說明,int scale = 4;1個int類型,在java中占用4個字節(jié)。 Integer.numberOfLeadingZeros(scale); 返回 scale 高位連續(xù)0的個數(shù),得出shift = 2, 而shift在如下方法使用 得出結論了吧,shift就是 用來定位數(shù)組中的內存位置,用來移位用的,每向左移動移位,在不越界的情況下,想當于乘以2。也就是int類型的長度為4,也就是第0個位置是0,第1(i)個位置是4,,第二個(i)位置是8,也就是偏移位置等于 i * 4,也就是 i << 2;總結出一個乘法轉換成移位操作的案例: a * (一個2的冪(n)的數(shù)) = a << n; 給出一個指定2的冪的數(shù),怎么算成n,,參照shift的計算方法。
原文:http://blog.csdn.net/prestigeding/article/details/52980801