1. 程式人生 > 其它 >原子操作類AtomicStampedReference

原子操作類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());
}
}