gpt4 book ai didi

java - java中AtomicMarkableReference的 "get"方法实现背后的原因是什么?

转载 作者:行者123 更新时间:2023-11-30 08:02:08 24 4
gpt4 key购买 nike

在 java 中,AtomicMarkableReference 可用于自动更新对象引用以及标记位。

javadoc状态:

Implementation note: This implementation maintains markable references by creating internal objects representing "boxed" [reference, boolean] pairs.

根据该类的 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;
}

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

最佳答案

这是因为Java没有Pair<L, R>类并且可能不会,即使标准库至少有三个类具有 private static class Pair .添加Pair OpenJDK 开发人员不止一次讨论过这个类,但提案总是被拒绝。 This mail 很好地解释了为什么 pair 不应该作为标准类出现(另外,整个邮件线程非常有用):

The problem is that classes like Pair simply go that much further to indulge the desire to never have to create any actual types of our own. When we're forced to create our own types, we begin to model our data more appropriately, which I believe leads us to create good abstractions at broader levels of granularity as well.

只要AtomicMarkableReference不公开其 Pair类,而在 Java 中,您不能更改传递的引用的值(调用者可以观察到这种更改),同时返回引用和位标志的唯一方法是从方法返回其中之一并将第二个设置为传递作为参数数组。所以这与并发无关,也与遗留无关,而是与语言设计决策有关。

关于java - java中AtomicMarkableReference的 "get"方法实现背后的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37145331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com