From ea1b70d7039227ed28a95b02247d043394bd78ed Mon Sep 17 00:00:00 2001 From: BaoPiao <39978082+BaoPiao@users.noreply.github.com> Date: Sat, 19 Mar 2022 17:19:59 +0800 Subject: [PATCH] =?UTF-8?q?AtomicMarkableReference=20=E6=98=AF=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=A7=A3=E5=86=B3ABA=E9=97=AE=E9=A2=98=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 因为AtomicMarkableReference是通过内部类Pair实现数据存储,每次替换都是通过Pair.of方法new一个类出来进行替换原先的值 如果ABA出现,那么最后的A肯定是一个新的Pair实例,即当前的A和之前的A不是同一个实例,当现场使用compareAndSet则会返回false 以下是compareAndSet的实现: Pair current = pair; return expectedReference == current.reference && expectedMark == current.mark && ((newReference == current.reference && newMark == current.mark) || casPair(current, Pair.of(newReference, newMark))); --- docs/java/concurrent/atomic-classes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/concurrent/atomic-classes.md b/docs/java/concurrent/atomic-classes.md index 7628e1fe..623a8d6e 100644 --- a/docs/java/concurrent/atomic-classes.md +++ b/docs/java/concurrent/atomic-classes.md @@ -37,7 +37,7 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 **引用类型** - AtomicReference:引用类型原子类 -- AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,~~也可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。~~ +- AtomicMarkableReference:原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来,也可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。 - AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。 **对象的属性修改类型**