Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较和交换_Java_Atomic - Fatal编程技术网

Java 比较和交换

Java 比较和交换,java,atomic,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,new

在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)  ??

将所有三个字段放在一个不可变对象中,即
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;
}

将所有三个字段放在一个不可变对象中,即
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;
}

如果您想要三个
ca
操作一起形成一个原子操作,我认为您需要
同步的
块/方法

您还可以考虑创建一个具有三个字段的包装类,并在参考文献中做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
}
然后将该类与原子引用一起使用:

public volatile AtomicReference<ThreeValueHolder> ref = null;

...

ref.compareAndSet(current, new ThreeValueHolder(1, 2, 3));
public volatile AtomicReference=null;
...
参考比较数据集(当前、新三个值持有人(1、2、3));

如果你想让三个
CA
操作一起构成一个原子操作,我认为你需要
同步的
块/方法

您还可以考虑创建一个具有三个字段的包装类,并在参考文献中做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
}
然后将该类与原子引用一起使用:

public volatile AtomicReference<ThreeValueHolder> ref = null;

...

ref.compareAndSet(current, new ThreeValueHolder(1, 2, 3));
public volatile AtomicReference=null;
...
参考比较数据集(当前、新三个值持有人(1、2、3));

这还不清楚。您的目标是什么行为?在这种情况下,
CAS
是什么?你能给出一些细节吗?我想比较三个内存位置,只有当它们都与相应的预期值匹配时,CAS操作才会写入新值。。。我猜是这样的。CAS是一种原子操作。它是compareAndSwap()的缩写。这不清楚。您的目标是什么行为?在这种情况下,
CAS
是什么?你能给出一些细节吗?我想比较三个内存位置,只有当它们都与相应的预期值匹配时,CAS操作才会写入新值。。。我猜是这样的。CAS是一种原子操作。它是compareAndSwap()的缩写。我不想为此使用锁或同步块/方法。无论如何,包装类似乎是一个不错的选择(而不是阻塞线程的方法)。我想我还可以想出一些魔法,使用
volatile
变量和内存
fences
,它们可以为操作提供可见性保证,但不能保证原子性。无论如何,很高兴一如既往地提供帮助。我不想为此使用锁或同步块/方法。无论如何,包装类似乎是一个不错的选择(而不是阻塞线程的方法)。我想我还可以想出一些魔法,使用
volatile
变量和内存
fences
,它们可以为操作提供可见性保证,但不能保证原子性。不管怎样,很高兴一如既往地帮忙。