是什么原因"得到" java中AtomicMarkableReference的方法实现?

时间:2016-05-10 17:34:51

标签: java concurrency java.util.concurrent language-implementation

在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;
}

使用这样的布尔数组有什么意义(而不是返回这对值)?是并发驱动的选择吗?或者遗留代码?

1 个答案:

答案 0 :(得分:3)

这是因为Java没有Pair<L, R>类,可能不会,尽管标准库至少有三个类private static class Pair。 OpenJDK开发人员不止一次地讨论了添加Pair类,并且提案始终被拒绝。 This邮件是一个非常好的解释,为什么对不应该作为标准类呈现(同样,整个邮件线程非常有用):

  

问题在于,像Pair这样的类只需要进一步放纵   渴望永远不必创造我们自己的任何实际类型。我们什么时候   被迫创建我们自己的类型,我们开始更多地模拟我们的数据   恰当地,我相信这会引导我们创造良好的抽象   更广泛的粒度级别。

只要AtomicMarkableReference没有公开其Pair类,并且在Java中,您就无法更改传递引用的值(通过调用者可以观察到此类更改的方式) ),返回引用和位标志的唯一方法是从方法返回其中一个,并将第二个设置为参数数组。所以它不是关于并发性,也不是关于遗产,而是关于语言设计决策。