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





