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)));
}
阅读 1417 · 发布于 2021-09-23
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓
昵称:
随便看看
换一批
-
OpenResty 中使用 ngx.location.capture 完成第三方接口请求阅读 10188
-
Java JMX MemoryManagerMXBean阅读 150
-
Vue 配置子路径阅读 109
-
前端 Chrome 反调试方法阅读 5263
-
Java module-info.java 关键字解释阅读 2253
-
Linux tcpdump: no suitable device found阅读 2798
-
Kubernetes 获取容器 ID阅读 1469
-
Spring Boot 配置 logback 文件阅读 3075
-
MySQL 之 Windows 免安装版本配置环境阅读 2164
-
CSS var 函数阅读 1580