比较和交换

时间:2014-05-05 19:35:30

标签: java atomic

有没有办法在Java中的多个内存位置上使用CAS操作?

我正在尝试逐个执行三个CAS操作,但这有一个问题是线程访问第一个内存位置(此处为old1)而另一个线程正在比较下一个内存位置(此处为old2)。例如,

if(CAS(old1,exp1,new1))

    if(CAS(old2,exp2,new2))

    if(CAS(old3,exp3,new3))

是否可以执行以下操作:

CAS(old1,old2,old3,exp1,exp2,exp3,new1,new2,new3)  ??

2 个答案:

答案 0 :(得分:3)

将所有三个字段放入一个不可变对象Foo。然后,给定AtomicReference<Foo> ref,写:

Foo current = ref.get();
if (foo.val1() == exp1 && foo.val2() == exp2 && foo.val3() == exp3) {
  return ref.compareAndSet(current, new Foo(new1, new2, new3));
} else {
  return false;
}

答案 1 :(得分:2)

如果您希望三个cas操作一起构成原子操作,我认为您需要synchronized块/方法。

您还可以考虑创建一个包含三个字段的包装类,并在引用时执行CAS:

public class ThreeValueHolder {
    private final int value0, value1, value2;

    public ThreeValueHolder(int value0, int value1, int value2) {
        this.value0 = value0;
        this.value1 = value1;
        this.value2 = value2;
    }

    //getters
}

然后将此课程与AtomicReference一起使用:

public volatile AtomicReference<ThreeValueHolder> ref = null;

...

ref.compareAndSet(current, new ThreeValueHolder(1, 2, 3));