Java:整数的原子元组

时间:2016-01-19 20:12:25

标签: java multithreading

我想知道我是否能以某种方式实现3个整数的原子元组,而不使用同步块。

我想一种方法是将3个int编码为一个原子长度,每个占用21位,但如果代码需要超过3个整数,则可能会中断。

那么这个案例的java goto实现会是什么?

1 个答案:

答案 0 :(得分:8)

使元组不可变,并使用AtomicReference。

public static class ThreeInts {
    private final int first;
    private final int second;
    private final int third;
    ...
}

AtomicReference<ThreeInts> threeInts = new AtomicReference<>(someDefault);

然后更新,它类似于:

while (true) {
    ThreeInts current = threeInts.get();
    ThreeInts next = somehowEvaluateNew(current);
    if (threeInts.compareAndSet(current, next) {
        break;
    }
}

您也可以只使用int[]代替课程。缺点是int[]不可变(并且不能变为不可变)。所以,要么你必须把它隐藏在像UnmodifiableIntArray这样的抽象背后,要么你需要让这个代码的所有用户都清楚地知道int[]一旦它被修改就不能被修改。投入原子参考。这显然需要你的一些信任,所以你应该小心;但这是一个选择。

如果您不介意自动装箱,也可以使用Collections.unmodifiableList(Arrays.asList(i0, i1, i2))代替ThreeInts