Java 并发编程之 AtomicMarkableReference
Java juc 大约 1486 字说明
AtomicStampedReference
解决了ABA
问题,但需要每次修改版本号比较繁琐,AtomicMarkableReference
只关心是否有改动。
代码
public class AtomicMarkableReferenceDemo {
public static void main(String[] args) {
AtomicMarkableReference<String> ref = new AtomicMarkableReference<>("A", false);
boolean marked = ref.isMarked();
String reference = ref.getReference();
boolean b = ref.compareAndSet(reference, "B", marked, true);
boolean b1 = ref.attemptMark("B", true);
System.out.println(b1);
}
}
源码解析
AtomicMarkableReference
底层是使用Pair
对象封装了reference
和mark
字段。
compareAndSet
底层源码是判断了Pair
对象。
private volatile Pair<V> pair;
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);
}
}
public boolean compareAndSet(V expectedReference,
V newReference,
boolean expectedMark,
boolean newMark) {
Pair<V> current = pair;
return
expectedReference == current.reference &&
expectedMark == current.mark &&
((newReference == current.reference &&
newMark == current.mark) ||
casPair(current, Pair.of(newReference, newMark)));
}
阅读 906 · 发布于 2021-09-23
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看
换一批
-
Android ListView 隐藏分割线阅读 1867
-
Linux 两个文件取并集、交集、差集阅读 3848
-
Android 权限大全阅读 2852
-
软考-系统架构设计师:逆向工程阅读 1683
-
OpenResty lua-resty-auto-ssl: failed to set ocsp stapling for阅读 1642
-
Git 提示 You asked me to pull without telling me which branch you...阅读 4338
-
IDEA 使用 Kubernetes 瑞士军刀 Telepresence 进行网络代理阅读 296
-
GitHub 访问慢解决方案阅读 2126
-
Docker 配置仓库的加速镜像阅读 874
-
PHP curl 报错:SSL connect error阅读 2463