关于jdk中的AtomicInteger的操作

本文深入解析了AtomicInteger类的工作原理,特别是其getAndIncrement方法如何实现线程安全的自增操作,并详细解释了Unsafe类及compareAndSet方法的作用。
  private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final long valueOffset;


    static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
      } catch (Exception ex) { throw new Error(ex); }

    }

private volatile int value;

这里的valueOffset 指的是value值相对于AtomicInteger对象首地址的在内存中偏移量,根据这个地址可以准确的定位value的值。volatile 可以保证不同线程下的内存可见性,

    public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }

getAndIncrement的操作相当于一个乐观锁,每次进行i++操作前先获取到原来的value值,最终进行改变数据时,比较当前所持有的value值和原来的value值current 是否一致,如果一致会进行修改值的操作。不一致的情况下会循环调用进行比较(随之带来的就是性能问题,会一直进行死循环,直到修改完value中的值)


compareAndSet的代码如下 

public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

主要传入当前的值this 和valueOfferset,这样可以定位到原本的value值,和excepte进行比较,如果线程不安全,就返回false.如果线程安全,将update的值赋给value.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值