我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java原子操作类源码分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java原子操作类源码分析

这篇文章主要介绍“Java原子操作类源码分析”,在日常操作中,相信很多人在Java原子操作类源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java原子操作类源码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们先来看一下部分源码:

public class AtomicLong extends Number implements java.io.Serializable {    private static final long serialVersionUID = 1927816293512124184L;    //1.获取Unsafe类实例    private static final Unsafe unsafe = Unsafe.getUnsafe();    //2.存放value的偏移量    private static final long valueOffset;    static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();    //3.用于判断是否支持Long类型无锁CAS    private static native boolean VMSupportsCS8();    static {        try {            //4.获取value在AtomicLong中的偏移量            valueOffset = unsafe.objectFieldOffset                (AtomicLong.class.getDeclaredField("value"));        } catch (Exception ex) { throw new Error(ex); }    }    //5.实际变量值    private volatile long value;        public AtomicLong(long initialValue) {        value = initialValue;    }    ············省略部分代码·············}

上面代码中,代码1处通过Unsafe.getUnsafe()获取到Unsafe类的实例(因为AtomicLong类是在rt.jar包下面的,AtomicLong类就是通过Bootstarp类加载器进行加载的)。代码5处,value被声明为volatile类型,保证内存的可见性。通过代码2,4获取value变量在AtomicLong类中的偏移量。

接下来介绍一下AtomicLong中的主要函数:

  • 递增和递减代码

//调用unsafe方法,设置value=value+1后,返回原始的值public final long getAndIncrement() {    return unsafe.getAndAddLong(this, valueOffset, 1L);}//调用unsafe方法,设置value=value-1后,返回原始的值public final long getAndDecrement() {    return unsafe.getAndAddLong(this, valueOffset, -1L);}//调用unsafe方法,设置value=value+1后,返回递增后的值public final long incrementAndGet() {    return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;}//调用unsafe方法,设置value=value-1后,返回递减后的值public final long decrementAndGet() {    return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L;}

上面的四个函数内部都是通过调用Unsafe的getAndAddLong方法来实现操作,这个函数是个原子性操作,这里第一个参数是AtomicLong实例的引用的,第二个参数是value变量在AtomicLong的偏移值,第三个参数是要设置的第二个变量的值。

其中getAndIncrement()方法在JDK7中实现逻辑为:

public final long getAndIncrement() {    while(true) {        long current = get();        long next = current + 1;        if (compareAndSet(current, next))            return current;    }}

如上代码中,每个线程是先拿到变量的当前值(由于value是volatile变量,所以这是获取的最新值),然后在工作内存中对其进行增1操作,而后使用CAS修改变量的值,如果设置失败,则循环继续尝试,直到设置成功。

JDK8中的逻辑为:

public final long getAndIncrement() {        retrturn unsafe.getAndAddLong(this, valueOffset, 1L);    }

其中JDK8中的unsafe.getAndAddLong的代码为:

public final long getAndAddLong(Object var1, long var2, long var4) {   long var6;   do {       var6 = this.getLongVolatile(var1, var2);   } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4));   return var6;}

从中可以看到,JDK7中的AtomicLong中循环逻辑已经被JDK8中的原子操作类Unsafe内置了。

  • boolean compareAndSet(long expect,long update)

public final boolean compareAndSet(long expect,long update) {    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);}

函数在内部调用了unsafe.compareAndSwapLong方法。如果原子变量中的value值等于expect,则使用update值更新该值并返回true,否则返回false。

到此,关于“Java原子操作类源码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java原子操作类源码分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java原子操作类源码分析

这篇文章主要介绍“Java原子操作类源码分析”,在日常操作中,相信很多人在Java原子操作类源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java原子操作类源码分析”的疑惑有所帮助!接下来,请跟着小编
2023-06-30

CountDownLatch和Atomic原子操作类源码分析

本篇内容主要讲解“CountDownLatch和Atomic原子操作类源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CountDownLatch和Atomic原子操作类源码分析”吧!引导
2023-06-29

Java多线程Atomic包操作原子变量与原子类的示例分析

这篇文章主要介绍Java多线程Atomic包操作原子变量与原子类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、何谓Atomic?Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位。计算机中的
2023-05-30

C#原子操作实例分析

这篇文章主要讲解了“C#原子操作实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#原子操作实例分析”吧!知识点竞争条件当两个或两个以上的线程访问共享数据,并且尝试同时改变它时,就发生
2023-06-29

Java中怎么实现原子操作类

这篇文章将为大家详细讲解有关Java中怎么实现原子操作类,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 一、引言在 JDK1.5 中新增 java.util.concurrent(J.U.C
2023-06-19

GO的锁和原子操作实例分析

本篇内容介绍了“GO的锁和原子操作实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!锁是什么锁 是用于解决隔离性的一种机制某个协程(线程
2023-07-05

python文件读写操作源码分析

本篇内容介绍了“python文件读写操作源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!文件写操作的案例# 打开文件(只写模式)fil
2023-07-05

Java多线程中原子性操作类怎么用

小编给大家分享一下Java多线程中原子性操作类怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言:在java5以后,我们接触到了线程原子性操作,也就是在修改
2023-06-25

源码分析Java中ThreadPoolExecutor的底层原理

这篇文章主要带大家从源码分析一下Java中ThreadPoolExecutor的底层原理,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
2023-05-19

java集合类源码分析之Set详解

Set集合与List一样,都是继承自Collection接口,常用的实现类有HashSet和TreeSet。值得注意的是,HashSet是通过HashMap来实现的而TreeSet是通过TreeMap来实现的,所以HashSet和TreeS
2023-05-31

java线程池的实现原理源码分析

这篇文章主要介绍“java线程池的实现原理源码分析”,在日常操作中,相信很多人在java线程池的实现原理源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java线程池的实现原理源码分析”的疑惑有所帮助!
2023-06-30

如何解析Python源码分析的相关操作步骤

今天就跟大家聊聊有关如何解析Python源码分析的相关操作步骤,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python是一种动态的脚本语言。具体的我就不多介绍了,源代码链接在这里:
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录