java.util.concurrent.atomic.AtomicReference 源码

类图:

源码: 

1package java.util.concurrent.atomic; 2 3import java.util.function.UnaryOperator; 4import java.util.function.BinaryOperator; 5import sun.misc.Unsafe; 6 7//原子变量类 V:变量类型 8public class AtomicReference<V> implements java.io.Serializable { 9 private static final long serialVersionUID = -1848883965231344442L;//版本号 10 11 private static final Unsafe unsafe = Unsafe.getUnsafe();//使用sun的Unsafe完成cas指令 12 13 private static final long valueOffset;//value内存地址相对于对象内存地址的偏移量 14 15 private volatile V value;//变量类型 16 17 static { 18 try { 19 //初始化valueOffset:通过unsafe.objectFieldOffset方法获取成员属性value内存地址相对于对象内存地址的偏移量 20 valueOffset = unsafe.objectFieldOffset (AtomicReference.class.getDeclaredField("value")); 21 } catch (Exception ex) { throw new Error(ex); } 22 } 23 24 //构造方法:value为null 25 public AtomicReference() { 26 } 27 28 /** 29 * 构造方法,传入指定V值 30 */ 31 public AtomicReference(V initialValue) { 32 value = initialValue; 33 } 34 35 /** 36 * 获取v值 37 */ 38 public final V get() { 39 return value; 40 } 41 42 /** 43 * 设为指定值 44 */ 45 public final void set(V newValue) { 46 value = newValue; 47 } 48 49 /** 50 * 最终设为指定值,但其它线程不能马上看到变化,会延时一会 51 */ 52 public final void lazySet(V newValue) { 53 unsafe.putOrderedObject(this, valueOffset, newValue); 54 } 55 56 /** 57 * CAS操作,现代CPU已广泛支持,是一种原子操作; 58 * 简单地说,当期待值expect与valueOffset地址处的值相等时,设置为update值 59 */ 60 public final boolean compareAndSet(V expect, V update) { 61 return unsafe.compareAndSwapObject(this, valueOffset, expect, update); 62 } 63 64 //和compareAndSet()方法相同 65 public final boolean weakCompareAndSet(V expect, V update) { 66 return unsafe.compareAndSwapObject(this, valueOffset, expect, update); 67 } 68 69 //以原子方式设置为给定值,并返回旧值 70 public final V getAndSet(V newValue) { 71 return (V)unsafe.getAndSetObject(this, valueOffset, newValue); 72 } 73 74 /** 75 * 以原子方式设置为给定值,并返回旧值 76 * updateFunction 一个参数的函数 77 */ 78 public final V getAndUpdate(UnaryOperator<V> updateFunction) { 79 V prev, next; 80 do { 81 prev = get(); 82 next = updateFunction.apply(prev); 83 } while (!compareAndSet(prev, next)); 84 return prev; 85 } 86 87 /** 88 * 以原子方式设置为给定值,并返回新值 89 * updateFunction 一个参数的函数 90 */ 91 public final V updateAndGet(UnaryOperator<V> updateFunction) { 92 V prev, next; 93 do { 94 prev = get(); 95 next = updateFunction.apply(prev); 96 } while (!compareAndSet(prev, next)); 97 return next; 98 } 99 100 /** 101 * 以原子方式设置为给定值,并返回旧值 102 * accumulatorFunction 两个参数的函数 103 */ 104 public final V getAndAccumulate(V x, BinaryOperator<V> accumulatorFunction) { 105 V prev, next; 106 do { 107 prev = get(); 108 next = accumulatorFunction.apply(prev, x); 109 } while (!compareAndSet(prev, next)); 110 return prev; 111 } 112 113 /** 114 * 以原子方式设置为给定值,并返回新值 115 * accumulatorFunction 两个参数的函数 116 */ 117 public final V accumulateAndGet(V x,BinaryOperator<V> accumulatorFunction) { 118 V prev, next; 119 do { 120 prev = get(); 121 next = accumulatorFunction.apply(prev, x); 122 } while (!compareAndSet(prev, next)); 123 return next; 124 } 125 126 //返回v类的toString()方法得到的字符串 127 public String toString() { 128 return String.valueOf(get()); 129 } 130 131}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )