AtomicIntegerArray

AtomicIntegerArray提供的功能:整型数组的元素支持原子性更新操作
获取、设置、减一、添加(n)、增一,延迟设置

类定义

    public class AtomicIntegerArray implements java.io.Serializable {
    private static final long serialVersionUID = 2862133569453604235L;

    private static final Unsafe unsafe = Unsafe.getUnsafe();
    //第一个元素相当于对象内存开始地址(有对象头等内存字段)的偏移量
    private static final int base = unsafe.arrayBaseOffset(int[].class);
    
    private static final int shift;
    //存储整型元素的数组
    private final int[] array;

    static {
        //scale为每个元素的字节偏移量, int为4字节
        int scale = unsafe.arrayIndexScale(int[].class);
        
        if ((scale & (scale - 1)) != 0)
            throw new Error("data type scale not a power of two");
        //scale为4时,leadingzero为29,所以shift为2
        //元素i位置为base+i*scale 与 base+ i << 2 等价, 乘以4相当于左移两位    
        shift = 31 - Integer.numberOfLeadingZeros(scale);
    }


   private long checkedByteOffset(int i) {
        if (i < 0 || i >= array.length)
            throw new IndexOutOfBoundsException("index " + i);

        return byteOffset(i);
    }
   
   //计算位置i的元素的内存偏移值, base + i << shift(此处为2)
    private static long byteOffset(int i) {
        return ((long) i << shift) + base;
    }
    
    //getAndSet还是利用unsafe的getAndSetInt方法,
    //但是要调用checkedByteOffset方法算出元素i的内存偏移值
    public final int getAndSet(int i, int newValue) {
        return unsafe.getAndSetInt(array, checkedByteOffset(i), newValue);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值