Java concurrency之AtomicReference原子类_动力节点Java学院整理
程序员文章站
2023-12-21 10:37:16
atomicreference介绍和函数列表
atomicreference是作用是对"对象"进行原子操作。
atomicreference函数列表
// 使...
atomicreference介绍和函数列表
atomicreference是作用是对"对象"进行原子操作。
atomicreference函数列表
// 使用 null 初始值创建新的 atomicreference。 atomicreference() // 使用给定的初始值创建新的 atomicreference。 atomicreference(v initialvalue) // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean compareandset(v expect, v update) // 获取当前值。 v get() // 以原子方式设置为给定值,并返回旧值。 v getandset(v newvalue) // 最终设置为给定值。 void lazyset(v newvalue) // 设置为给定值。 void set(v newvalue) // 返回当前值的字符串表示形式。 string tostring() // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean weakcompareandset(v expect, v update)
atomicreference源码分析(基于jdk1.7.0_40)
在jdk1.7.0_40中atomicreference.java的源码如下:
public class atomicreference<v> implements java.io.serializable { private static final long serialversionuid = -1848883965231344442l; // 获取unsafe对象,unsafe的作用是提供cas操作 private static final unsafe unsafe = unsafe.getunsafe(); private static final long valueoffset; static { try { valueoffset = unsafe.objectfieldoffset (atomicreference.class.getdeclaredfield("value")); } catch (exception ex) { throw new error(ex); } } // volatile类型 private volatile v value; public atomicreference(v initialvalue) { value = initialvalue; } public atomicreference() { } public final v get() { return value; } public final void set(v newvalue) { value = newvalue; } public final void lazyset(v newvalue) { unsafe.putorderedobject(this, valueoffset, newvalue); } public final boolean compareandset(v expect, v update) { return unsafe.compareandswapobject(this, valueoffset, expect, update); } public final boolean weakcompareandset(v expect, v update) { return unsafe.compareandswapobject(this, valueoffset, expect, update); } public final v getandset(v newvalue) { while (true) { v x = get(); if (compareandset(x, newvalue)) return x; } } public string tostring() { return string.valueof(get()); } }
说明:
atomicreference的源码比较简单。它是通过"volatile"和"unsafe提供的cas函数实现"原子操作。
(01) value是volatile类型。这保证了:当某线程修改value的值时,其他线程看到的value值都是最新的value值,即修改之后的volatile的值。
(02) 通过cas设置value。这保证了:当某线程池通过cas函数(如compareandset函数)设置value时,它的操作是原子的,即线程在操作value时不会被中断。
atomicreference示例
// atomicreferencetest.java的源码
import java.util.concurrent.atomic.atomicreference; public class atomicreferencetest { public static void main(string[] args){ // 创建两个person对象,它们的id分别是101和102。 person p1 = new person(101); person p2 = new person(102); // 新建atomicreference对象,初始化它的值为p1对象 atomicreference ar = new atomicreference(p1); // 通过cas设置ar。如果ar的值为p1的话,则将其设置为p2。 ar.compareandset(p1, p2); person p3 = (person)ar.get(); system.out.println("p3 is "+p3); system.out.println("p3.equals(p1)="+p3.equals(p1)); } } class person { volatile long id; public person(long id) { this.id = id; } public string tostring() { return "id:"+id; } }
运行结果:
p3 is id: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()实际上是调用"=="去比较两个对象,即比较两个对象的地址是否相等。
推荐阅读
-
Java concurrency之AtomicReference原子类_动力节点Java学院整理
-
Java concurrency之互斥锁_动力节点Java学院整理
-
Java8新特性之JavaFX 8_动力节点Java学院整理
-
Java concurrency之锁_动力节点Java学院整理
-
Java8新特性之Base64详解_动力节点Java学院整理
-
Java8新特性之泛型的目标类型推断_动力节点Java学院整理
-
Java8新特性之StampedLock_动力节点Java学院整理
-
Java8新特性之lambda的作用_动力节点Java学院整理
-
Java数据库连接池之proxool_动力节点Java学院整理
-
Java数据库连接池之c3p0简介_动力节点Java学院整理