是否有任何方法在Java中使用超过1个内存位置的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) ??
将这三个字段放入一个不可变对象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;
}
如果你想要三个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));