目录
Stamped 和 Markable 的区别
示例代码
所以这个东西是一次性的
从来没听说过 从来没见过
Stamped 和 Markable 的区别
标记号 boolean 一次性的
版本号 整型数
不建议用 Markable 解决 ABA 问题
AtomicMarkableReference
是一个位于java.util.concurrent.atomic
包中的类。它提供了一种原子性的方式来管理一个带有标记的引用。这在一些需要同时跟踪对象引用和一个标记状态的场景中非常有用,例如实现乐观锁机制或者在多线程环境下标记某个对象的特定状态。
示例代码
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicMarkableReference;
public class AtomicMarkableReferenceDemo {
static AtomicMarkableReference atomicMarkableReference = new AtomicMarkableReference(100,false);
public static void main(String[] args) {
new Thread(() ->{
boolean marked = atomicMarkableReference.isMarked();
System.out.println(Thread.currentThread().getName()+"---默认修改标识 "+marked);
try {
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException e){
e.printStackTrace();
}
atomicMarkableReference.compareAndSet(100,101,marked,!marked);
},"t1").start();
try {
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
e.printStackTrace();
}
new Thread(() ->{
boolean marked = atomicMarkableReference.isMarked();
System.out.println(Thread.currentThread().getName()+"---默认修改标识 "+marked);
try {
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e){
e.printStackTrace();
}
boolean b = atomicMarkableReference.compareAndSet(101, 100, marked, !marked);
System.out.println(Thread.currentThread().getName()+"修改"+b);
System.out.println(atomicMarkableReference.getReference());
System.out.println();
},"t2").start();
}
}
输出