原子更新基本类型类是怎么保证原子性的

  原子更新基本类型类是什么


  原子更新基本类型类就是在保证原子性的前提下更新基本类型的值,Atomic包提供了以下三个类。

  1.AtomicBoolean:原子更新布尔类型

  2.AtomicInteger:原子更新整型

  3.AtomicLong:原子更新长整型

  就拿AtomicInteger举例,这个方法的作用就是把操作对象原先的值做一个++的操作,但是众所周知,i++这种操作他是不保证原子性的,那AtomiceInteger是怎么保证的,先来看看AtomicInteger的常用用法:

  1.int addAddGet(int delta):以原子方式将对象的值和参数中的值进行相加并返回结果。

  2.Boolean compareAndSet(int expect,int update):这就是cas,比较并替换,当输入的数值等于预期值就用原子的方式将预期值设置为输入的值。

  3.int getAndIncrement():以原子的方式将当前值+1,返回自增前的值。

  

  那么这些方法是怎么保证原子性的呢,来看看源码:

public final int getAndIncrement() {
//这里的for(;;)是比while(true)的效率更高的,因为每次不用判断直接进入循环体
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

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

  
  首先是一个死循环for(;;),然后对当前数值进行++操作,最后用cas来保证原子性,先检查当前数值是否等于current,如果等于那说明中间没有线程对该值进行了改变,直接将当前数值更新成++后的next的值(注意,这里有可能会发生ABA问题,但是我看了其他大佬的博客,发现原子类里有一个叫AtomicStampedReference的方法,该方法用版本号来保证不会有aba问题发生),如果当前数值不等于next,那么就会重新进入for循环进行下一次的更新操作。
  
  

我话讲完,如有不对的地方请指出,十分感谢!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值