从 Atomicinteger来学习 Java的原子类

前言

Java的concurrent包一直都是很重要的知识点,因为他是进阶高级工程师必备,而其中的atomic包中的原子类是最为经常使用到的,所以学习一下atomic下的一些类的源码.

Java原子类实现了线程安全的操作,比如AtomicInteger实现了对int值的安全的加减等.

所以我们学习主要分为两部分,首先学习为什么可以实现线程安全?其次是学习这些类的API,加强记忆方便后续使用.

怎么实现线程安全?

这个我们以AtomicInteger为例,其中的incrementAndGet()方法实现方式为:

    //API
    public final int incrementAndGet() {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }

    //CAS
    public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

可以看到实现比较简单,调用了Unsafe类的getAndAddInt方法,该方法的实现也贴了出来,其中调用了两个native方法.

实现原子操作的机制是:CAS.

CAS:compare and swap,比较交换,当且仅当目标值等于给定值的时候才进行写入操作.具体原理可以google一下.

可以看到在上面的getAndAddInt方法中,显示获取了当前内存地址的值,然后进行比较交换,如果相同则成功,不相同则轮询.

AtomicInteger的常用API

  • incrementAndGet: 自增一且返回新值.
  • getAndIncrement: 获取当前值之后将其自增.
  • decrementAndGet: 自减一之后返回新值.
  • getAndDecrement: 获取当前值之后自减.
  • get: 获取当前值.
  • set: 设置一个值.
  • getAndSet: 设置新值,返回旧值.

AtomicBoolean的常用API

  • getAndSet:设置新值返回旧值.
  • get: 返回当前值.
  • set: 设置一个值.
  • compareAndSet: CAS实现的set.

AtomicLong 略过

AtomicReference

原子的引用….可以随便放进去什么值.

API出来了get和set外:

  • updateAndGet: 更新值并获取新值.
  • getAndUpdate: 获取旧值之后更新值.

注意传入的参数是声明的V.

AtomicIntegerArray

int数字的原子类.

AtomicInteger并没有什么不同,只是对传入的数组下标进行了一下计算,来实现对数组的某个index上的值的原子更改.

完.好水啊…以为原子类要看很久呢.

ChangeLog

2019-04-23 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏慕容千语的架构笔记

Java程序员进阶笔记实操—大型网站架构技术之负载均衡详解(2)

欢迎关注专栏:Java架构技术进阶。里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦。

10040
来自专栏趣谈编程

你真的知道链表和数组的区别吗?

对一名程序猿来讲,使用哪种语言来开发程序不是最重要的,数据结构和算法才是核心,是程序猿的内功,最终决定你的技术上限。如果你想拔高自己的水平,提高核心竞争力,数据...

86630
来自专栏javathings

HttpServletRequest 使用@Autowired 注解会有问题吗?

SpringBoot 中,默认注入的对象是单例对象,那么,我们如果注入一个 HttpServletRequest,会有问题吗?因为每次请求,Request 是不...

84950
来自专栏云计算与大数据

Dubbo for Go,Ready for Now.

多语言支持是 Dubbo 发展生态的重点之一。目前,Dubbo 已经支持 PHP/Node.js/Python,同时,基于标准的 Java REST API -...

27130
来自专栏贺利权

Android 双击返回键退出程序的3种写法~

LZ-Says: 去年真的浪费了好多的机会,,,而今年,却找不到一个合适的机会,,,还是自己能力有所欠缺啊。。。从一点点开始积累吧。。。那个谁,,,这次,我会...

18420
来自专栏全栈技术Kojo

Netty-server

    当然网上对Netty 这框架有许多人都介绍,对于在网络编程的地位以及优劣性也有很多,打架可以去看看,今天我主要的目的是将自己项目中的实例拿出来和打架风向

18530
来自专栏全栈技术Kojo

优化springboot

原文地址:https://www.cnblogs.com/superfj/p/8667977.html

11840
来自专栏贺利权

Apk 反编译前期了解

LZ-Says:学习之路,似乎枯燥乏味,唯有耐着性子,独自前行,当光明笼罩的那一刻,一切,也仿佛明亮了许多。

15430
来自专栏开发之途

重拾Kotlin(17)-异常

和 Java 不同的是,Kotlin 中 throw 结构是一个表达式,可以作为另一个表达式的一部分来使用

7730
来自专栏JAVA葵花宝典

Spring Boot MyBatis 动态数据源切换、多数据源,读写分离

项目地址: https://github.com/helloworlde/SpringBoot-DynamicDataSource

25750

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励