博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.util.concurrent.atomic.AtomicReference 源码
阅读量:7083 次
发布时间:2019-06-28

本文共 3335 字,大约阅读时间需要 11 分钟。

hot3.png

类图:

源码: 

package java.util.concurrent.atomic;import java.util.function.UnaryOperator;import java.util.function.BinaryOperator;import sun.misc.Unsafe;//原子变量类 V:变量类型public class AtomicReference
implements java.io.Serializable { private static final long serialVersionUID = -1848883965231344442L;//版本号 private static final Unsafe unsafe = Unsafe.getUnsafe();//使用sun的Unsafe完成cas指令 private static final long valueOffset;//value内存地址相对于对象内存地址的偏移量 private volatile V value;//变量类型 static { try { //初始化valueOffset:通过unsafe.objectFieldOffset方法获取成员属性value内存地址相对于对象内存地址的偏移量 valueOffset = unsafe.objectFieldOffset (AtomicReference.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } //构造方法:value为null public AtomicReference() { } /** * 构造方法,传入指定V值 */ public AtomicReference(V initialValue) { value = initialValue; } /** * 获取v值 */ 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); } /** * CAS操作,现代CPU已广泛支持,是一种原子操作; * 简单地说,当期待值expect与valueOffset地址处的值相等时,设置为update值 */ public final boolean compareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); } //和compareAndSet()方法相同 public final boolean weakCompareAndSet(V expect, V update) { return unsafe.compareAndSwapObject(this, valueOffset, expect, update); } //以原子方式设置为给定值,并返回旧值 public final V getAndSet(V newValue) { return (V)unsafe.getAndSetObject(this, valueOffset, newValue); } /** * 以原子方式设置为给定值,并返回旧值 * updateFunction 一个参数的函数 */ public final V getAndUpdate(UnaryOperator
updateFunction) { V prev, next; do { prev = get(); next = updateFunction.apply(prev); } while (!compareAndSet(prev, next)); return prev; } /** * 以原子方式设置为给定值,并返回新值 * updateFunction 一个参数的函数 */ public final V updateAndGet(UnaryOperator
updateFunction) { V prev, next; do { prev = get(); next = updateFunction.apply(prev); } while (!compareAndSet(prev, next)); return next; } /** * 以原子方式设置为给定值,并返回旧值 * accumulatorFunction 两个参数的函数 */ public final V getAndAccumulate(V x, BinaryOperator
accumulatorFunction) { V prev, next; do { prev = get(); next = accumulatorFunction.apply(prev, x); } while (!compareAndSet(prev, next)); return prev; } /** * 以原子方式设置为给定值,并返回新值 * accumulatorFunction 两个参数的函数 */ public final V accumulateAndGet(V x,BinaryOperator
accumulatorFunction) { V prev, next; do { prev = get(); next = accumulatorFunction.apply(prev, x); } while (!compareAndSet(prev, next)); return next; } //返回v类的toString()方法得到的字符串 public String toString() { return String.valueOf(get()); }}

 

转载于:https://my.oschina.net/langwanghuangshifu/blog/2879247

你可能感兴趣的文章
linux命令之scp
查看>>
查看 MySQL 用户权限
查看>>
统一预付费ECS资源到期日
查看>>
Nature:美国军方资助科研项目,AI植入大脑治疗心理疾病
查看>>
使用Iterator遍历Sheet(POI)验证及解释结果有序性
查看>>
HttpContext.Current.Cache 过期时间
查看>>
提问的智慧
查看>>
AIX平台上11.2 Grid Infrastructure RDBMS进程的user是grid用户?
查看>>
MySQL 存储过程常用SQL语句收集
查看>>
Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)
查看>>
理解dockerfile是如何工作的?
查看>>
Win10 UWP开发中的重复性静态UI绘制小技巧 1
查看>>
UWP入门(四)--设置控件样式
查看>>
驱动程序调试方法之printk——自制proc文件(二)
查看>>
win8双屏敲代码
查看>>
广域网成为“云计算”发展的瓶颈所在
查看>>
[WCF安全系列]绑定、安全模式与客户端凭证类型:NetNamedPipeBinding、NetTcpBinding与NetMsmqBinding...
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.42. Perl-5.20.2...
查看>>
VC中分割文件路径的分割类
查看>>
2017年最佳开源网络监控工具
查看>>