Java concurrency之AtomicReference原子类_动力节点Java学院整理
AtomicReference介绍和函数列表
AtomicReference是作用是对"对象"进行原子操作。
AtomicReference函数列表
//使用null初始值创建新的AtomicReference。 AtomicReference() //使用给定的初始值创建新的AtomicReference。 AtomicReference(VinitialValue) //如果当前值==预期值,则以原子方式将该值设置为给定的更新值。 booleancompareAndSet(Vexpect,Vupdate) //获取当前值。 Vget() //以原子方式设置为给定值,并返回旧值。 VgetAndSet(VnewValue) //最终设置为给定值。 voidlazySet(VnewValue) //设置为给定值。 voidset(VnewValue) //返回当前值的字符串表示形式。 StringtoString() //如果当前值==预期值,则以原子方式将该值设置为给定的更新值。 booleanweakCompareAndSet(Vexpect,Vupdate)
AtomicReference源码分析(基于JDK1.7.0_40)
在JDK1.7.0_40中AtomicReference.java的源码如下:
publicclassAtomicReferenceimplementsjava.io.Serializable{ privatestaticfinallongserialVersionUID=-1848883965231344442L; //获取Unsafe对象,Unsafe的作用是提供CAS操作 privatestaticfinalUnsafeunsafe=Unsafe.getUnsafe(); privatestaticfinallongvalueOffset; static{ try{ valueOffset=unsafe.objectFieldOffset (AtomicReference.class.getDeclaredField("value")); }catch(Exceptionex){thrownewError(ex);} } //volatile类型 privatevolatileVvalue; publicAtomicReference(VinitialValue){ value=initialValue; } publicAtomicReference(){ } publicfinalVget(){ returnvalue; } publicfinalvoidset(VnewValue){ value=newValue; } publicfinalvoidlazySet(VnewValue){ unsafe.putOrderedObject(this,valueOffset,newValue); } publicfinalbooleancompareAndSet(Vexpect,Vupdate){ returnunsafe.compareAndSwapObject(this,valueOffset,expect,update); } publicfinalbooleanweakCompareAndSet(Vexpect,Vupdate){ returnunsafe.compareAndSwapObject(this,valueOffset,expect,update); } publicfinalVgetAndSet(VnewValue){ while(true){ Vx=get(); if(compareAndSet(x,newValue)) returnx; } } publicStringtoString(){ returnString.valueOf(get()); } }
说明:
AtomicReference的源码比较简单。它是通过"volatile"和"Unsafe提供的CAS函数实现"原子操作。
(01)value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
(02)通过CAS设置value。这保证了:当某线程池通过CAS函数(如compareAndSet函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。
AtomicReference示例
//AtomicReferenceTest.java的源码
importjava.util.concurrent.atomic.AtomicReference;
publicclassAtomicReferenceTest{
publicstaticvoidmain(String[]args){
//创建两个Person对象,它们的id分别是101和102。
Personp1=newPerson(101);
Personp2=newPerson(102);
//新建AtomicReference对象,初始化它的值为p1对象
AtomicReferencear=newAtomicReference(p1);
//通过CAS设置ar。如果ar的值为p1的话,则将其设置为p2。
ar.compareAndSet(p1,p2);
Personp3=(Person)ar.get();
System.out.println("p3is"+p3);
System.out.println("p3.equals(p1)="+p3.equals(p1));
}
}
classPerson{
volatilelongid;
publicPerson(longid){
this.id=id;
}
publicStringtoString(){
return"id:"+id;
}
}
运行结果:
p3isid:102 p3.equals(p1)=false
结果说明:
新建AtomicReference对象ar时,将它初始化为p1。
紧接着,通过CAS函数对它进行设置。如果ar的值为p1的话,则将其设置为p2。
最后,获取ar对应的对象,并打印结果。p3.equals(p1)的结果为false,这是因为Person并没有覆盖equals()方法,而是采用继承自Object.java的equals()方法;而Object.java中的equals()实际上是调用"=="去比较两个对象,即比较两个对象的地址是否相等。
热门推荐
10 诗词送行祝福语大全简短
11 新房开工吉日祝福语简短
12 50多岁生日简短祝福语
13 安徽疫情祝福语简短英语
14 农民朋友发财祝福语简短
15 对生活祝福语简短精辟
16 搬家词简短祝福语朋友
17 女神结婚快乐祝福语简短
18 文学短句祝福语大全简短