我想知道我是否能以某种方式实现3个整数的原子元组,而不使用同步块。
我想一种方法是将3个int编码为一个原子长度,每个占用21位,但如果代码需要超过3个整数,则可能会中断。
那么这个案例的java goto实现会是什么?
答案 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
。