JUC原子类详解(CAS)

本文介绍了CAS(Compare-And-Swap)原理,这是一种CPU原子指令,用于线程间在共享变量上的同步操作。文章详细解释了如何使用getAndAdd,getAndSet等方法,确保在多线程环境下数据的一致性。

CAS

CAS( Compare-And-Swap ),它是一条CPU的原子指令,其作用是让CPU先进行比较两个值是否相等,然后原子地更新某个位置的值。这两个值是什么呢,比如说有两个线程共享一个变量a,这两个线程都拥有这个变量a的拷贝,分别是a1和a2。

当一个线程(1)被执行时,它的共享变量为a1,if(a==a1) 说明共享变量的值没有改变,这个时候将这个线程中被更改后的a1与共享变量交换,CAS操作成功,此时共享变量的值改变了。

另一个线程(2)执行时,会发现它的共享变量a2和最新共享变量的值不相等,那就不可以对共享变量进行操作,CAS操作失败,此时线程2重新获取共享变量的值(更新a2),重复CAS操作,直到CAS操作成功。

public final int getAndAddInt(Object paramObject, long paramLong, int paramInt)
  {
    int i;
    do
      i = getIntVolatile(paramObject, paramLong);//当前对象、最新共享变量value
    //比较历史共享变量的值与当前共享变量的值是否相等、相等则改变、否则更新当前线程的历史共享变量,进行下一次循环比较,直到成功
    while (!compareAndSwapInt(paramObject, paramLong, i, i + paramInt));
    return i;
  }

  public final long getAndAddLong(Object paramObject, long paramLong1, long paramLong2)
  {
    long l;
    do
      l = getLongVolatile(paramObject, paramLong1);
    while (!compareAndSwapLong(paramObject, paramLong1, l, l + paramLong2));
    return l;
  }

  public final int getAndSetInt(Object paramObject, long paramLong, int paramInt)
  {
    int i;
    do
      i = getIntVolatile(paramObject, paramLong);
    while (!compareAndSwapInt(paramObject, paramLong, i, paramInt));
    return i;
  }

  public final long getAndSetLong(Object paramObject, long paramLong1, long paramLong2)
  {
    long l;
    do
      l = getLongVolatile(paramObject, paramLong1);
    while (!compareAndSwapLong(paramObject, paramLong1, l, paramLong2));
    return l;
  }

  public final Object getAndSetObject(Object paramObject1, long paramLong, Object paramObject2)
  {
    Object localObject;
    do
      localObject = getObjectVolatile(paramObject1, paramLong);
    while (!compareAndSwapObject(paramObject1, paramLong, localObject, paramObject2));
    return localObject;
  }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值