原子操作类AtomicStampedReference

/**
*代码说明:演示带版本戳的原子操作类
*/
public class UseAtomicStampedReference {
static AtomicStampedReference<String> asr
= new AtomicStampedReference("mark",0);

public static void main(String[] args) throws InterruptedException {
//拿到当前的版本号(旧)
final int oldStamp = asr.getStamp();

final String oldReference = asr.getReference();
System.out.println(oldReference+"============"+oldStamp);

Thread rightStampThread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":当前变量值:"
+oldReference + "-当前版本戳:" + oldStamp + "-"
+ asr.compareAndSet(oldReference,
oldReference + "+Java", oldStamp,
oldStamp + 1));
}
});

Thread errorStampThread = new Thread(new Runnable() {
@Override
public void run() {
String reference = asr.getReference();
          //获取了最新的值,但是版本号是旧的,所以更新失败
System.out.println(Thread.currentThread().getName()
+":当前变量值:"
+reference + "-当前版本戳:" + asr.getStamp() + "-传入版本戳"+oldStamp
+ asr.compareAndSet(reference,reference + "+C",
oldStamp,oldStamp +1));
}
});
rightStampThread.start();
rightStampThread.join();
errorStampThread.start();
errorStampThread.join();

System.out.println(asr.getReference()+"============"+asr.getStamp());
}
}
posted @ 2021-06-24 17:56  kixxz  阅读(49)  评论(0编辑  收藏  举报