AtomicMarkableReference类是一个线程安全的类,该类封装了一个对象的引用reference和一个布尔值mark,可以原子性地对这两个值进行更新。
定义:
public class AtomicMarkableReference<V> exntends Object
其中,V为需要标记的原子操作的类型。
该类的构造方法如下:
AtomicMarkableReference( V initialValue,boolean initialMark)
该构造方法使用给定的初始值引用reference和mark进行赋值。
例如:定义一个初始值为null,未标记的AtomicMarkReference对象:
AtomicMarkableReference<node> amf = new AtomicMarkableReference<Node>(null,false);
其中,Node为自定义类。
Demo示例:
public class Worker extends Thread{
AtomicMarkableReference<Integer> amr;
public Worker(AtomicMarkableReference amr,String name){
this.amr = amr;
Thread.currentThread().setName(name);
}
public void run(){
String name = Thread.currentThread().getName();
System.out.println("线程"+name +"读到原子标记的初始化值为:"+amr.isMarked() );
//boolean compareAndSet(V expectedReference, V newReference,boolean excpectedMark,boolean newMark)
//如果当前引用Reference 和 expectedReference相同,并且当前标记mark值和期望mark值相同,则原子更新引用和标记为新值newReference 和 newMark
if(amr.compareAndSet(0,1,false,true)){
System.out.println("线程"+name + "操作的原子当前值为:"+ amr.isMarked());
System.out.println("线程"+name+"正在将原子标记的值由0设置为1");
}else{
System.out.println("线程"+name+"原子操作没有成功");
}
}
}
public class Index{
public static void main(String [] args){
AtomicMarkableReference<Integer> amr = new AtomicMarkableReference<Integer>(0,false);
Thread ta = new Worker(amr,"A");
Thread tb = new Worker(amr,"B");
ta.start();
tb.start();
}
}