在java中, AtomicMarkableReference 可用于原子地更新对象引用以及标记位。
javadoc州:
实施说明:此实施通过创建表示"盒装"的内部对象来维护可标记的引用。 [reference,boolean]对。
根据在类的java 8源代码中可以看到的内容,这是真的:
package java.util.concurrent.atomic;
public class AtomicMarkableReference<V> {
private static class Pair<T> {
final T reference;
final boolean mark;
private Pair(T reference, boolean mark) {
this.reference = reference;
this.mark = mark;
}
static <T> Pair<T> of(T reference, boolean mark) {
return new Pair<T>(reference, mark);
}
}
private volatile Pair<V> pair;
public AtomicMarkableReference(V initialRef, boolean initialMark) {
pair = Pair.of(initialRef, initialMark);
}
// [...] class methods
}
是否有理由设计该类的get方法?
public V get(boolean[] markHolder) {
Pair<V> pair = this.pair;
markHolder[0] = pair.mark;
return pair.reference;
}
使用这样的布尔数组有什么意义(而不是返回这对值)?是并发驱动的选择吗?或者遗留代码?
答案 0 :(得分:3)
这是因为Java没有Pair<L, R>
类,可能不会,尽管标准库至少有三个类private static class Pair
。 OpenJDK开发人员不止一次地讨论了添加Pair
类,并且提案始终被拒绝。 This邮件是一个非常好的解释,为什么对不应该作为标准类呈现(同样,整个邮件线程非常有用):
问题在于,像Pair这样的类只需要进一步放纵 渴望永远不必创造我们自己的任何实际类型。我们什么时候 被迫创建我们自己的类型,我们开始更多地模拟我们的数据 恰当地,我相信这会引导我们创造良好的抽象 更广泛的粒度级别。
只要AtomicMarkableReference
没有公开其Pair
类,并且在Java中,您就无法更改传递引用的值(通过调用者可以观察到此类更改的方式) ),返回引用和位标志的唯一方法是从方法返回其中一个,并将第二个设置为参数数组。所以它不是关于并发性,也不是关于遗产,而是关于语言设计决策。