最近研究 Java 的并发包,了解到关于原子类的操作,这里将自己了解到的贴出来功能大家参考一下,有什么不足的地方还望大家指正,及时更新。

AtomicInteger 是 Java 1.5 开始在 atomic 包提供的可以在多线程条件下安全的访问和操作 int 数据类型的类,之前我们对操作 int 数据类型的时候,通常用 i++、i-- 等操作,但是这样的操作在多线程下是不安全的,因为这样的操作并不是原子的,下面我们看看例子:

public class IntegerTest {private static int number = 0;private final ststic int count = 1000000;public static void main(String[] args){Runnable runnable1 = createRunnable();Runnable runnable2 = createRunnable();//这里执行 2000000 次new Thread(runnable1).start();new Thread(runnable2).start();try{Thread.sleep(1000);// 打印System.out.println(number);} catch (InterruptedException e) {e.printStackTrace();}}public static Runnable createRunnable(){return ()->{for(int i = 0; i < count; i++){number++;}}}
}
复制代码

经测试,最后的打印结果是:1048708。当然,每次打印的值都不一样,但是这正说明了在多线程下,针对 int 的操作是不安全的。

以后针对这样的场景可以使用 AotmicInteger 类,它帮助我们解决了多线程下的安全问题,并且提供了更所的操作方法,下面介绍一下这个类的方法介绍:

1、byteValue() —— 这个方法继承自 Number 类,以 byte 类型返回当前值;
2、shortValue() —— 这个方法继承自 Number 类,以 short 类型返回当前值;
3、intValue() —— 这个方法继承自 Number 类,以 int 类型返回当前值;
4、longValue() —— 这个方法继承自 Number 类,以 long 类型返回当前值;
5、floatValue() —— 这个方法继承自 Number 类,以 float 类型返回当前值;
6、doubleValue() —— 这个方法继承自 Number 类,以 double 类型返回当前值;7、getAndIncrement() —— 这个方法先获取当前值,然后再自增 1 (类似 i++);
8、incrementAndGet() —— 这个方法先自增 1 (类似 ++i),然后再返回这个值;
9、getAndIncrement() —— 这个方法先获取当前值,然后再自减 1 (类似 i--);
10、incrementAndGet() —— 这个方法先自减 1 (类似 --i),然后再返回这个值;11、addAndGet(int value) —— 先加上 value,然后返回之后的值;
12、getAndAdd(int value)—— 先获取当前值,然后自己在加上 value;//从这儿我们可以发现这个类的方法命名很直观,从名字就能知道这个方法的作用13、compareAndSet(int first, int second) —— 如果当前值等于 first,返回 true,同时将值更新为 second,
否则返回 false,但不会更新;
14、weakCompareAndGet(int first, int second) —— 与 compareAndSet 一样(源码是一样);15、getAndSet(int value) —— 先获取当前值,然后再设置为 value;16、getAndUpdate(IntUnaryOperator op) —— 这个方法是 Java 1.8 开始提供的,这个方法自身返回当前值。
同时会把 op 的返回值设置为新值,具体参考 IntUnaryOperator 类,关于 function 包使用方法以后会介绍;
17、updateAndGet(IntUnaryOperator op) —— 这个方法先将 op 的返回值作为新值,然后返回这个新值;18、getAndAccumulate(int val, IntBinaryOperator op) —— 这个方法返回值,然后将当前值和 val 作为参数传给 op,
将 op 的返回值设置为新值;
19、accumulateAndGet(int val, IntBinaryOperator op) —— 这个方法先将当前值和 val 作为参数传给 op,
将 op 的返回值设置为新值,然后返回;20、set(int val) —— 设置;
21、lazySet(int val) —— 设置(与 set 一样,区别暂时还不知,但实现方式不一样)。
复制代码

以上就是 AtomicInteger 类的全部方法了,但是我在阅读源码的时候还发现了一些疑惑的地方,比如 getAndAccumulate 方法在内部的实现中循环调用了 compareAndSet 方法,这儿有什么必要循环调用呢?暂时还不清楚,但这大概就是我们是我们在探索的道路上越走越远的一大动力吧!以后有什么新的发现会及时更新,如有人清楚,还望告知。

谢谢大家,请大家持续关注!

Java 原子类的操作 AtomicInteger相关推荐

  1. Java原子类中CAS的底层实现,java高级面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

  2. 源码学习【原子类AtomicInteger】Java原子类底层实现(解释详细)

    原子类AtomicInteger 在Java中,有很多方法可以保证多线程下数据的安全,AtomicXXXX这些类就是其中的一种,原子类,可以保证每一步操作都是原子操作.这次就对AtomicIntege ...

  3. java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

    CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题(1)CAS是什么? 比较并交换 举例1,  CAS产生场景代码? importjava.util.concurrent ...

  4. java 原子类能做什么_死磕 java原子类之终结篇(面试题)

    概览 原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换. 原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割 ...

  5. java 原子类能做什么_Java原子类中可以靠版本号比较为什么还需要CAS操作??

    我觉得java的AtomicStampedReference确实蛮坑爹的,每次cas不管成功失败都会new出一个对象,性能有一定影响.最好的解法是像c++的folly库一样能偷64位指针的高16位做s ...

  6. java 原子类_小学妹教你并发编程的三大特性:原子性、可见性、有序性

    在并发编程中有三个非常重要的特性:原子性.有序性,.可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有可能被问到,小学妹就忍 ...

  7. java+cas实现类_像宝石一样的Java原子类-基于CAS实现

    主要内容 1. 线程同步标准的处理方法:上锁 2. 锁的问题 3. 硬件同步原语CAS 4. 使用CAS实现计数器 5. Lock-free和 wait-free 算法 6. Atomic原子变量类 ...

  8. Java并发编程—Atomic原子类

    目录 Atomic 1. AtomicInteger a. 多线程并发访问问题 b. 用 AtomicInteger 类解决 2. AtomicIntegerArray a. 多线程并发访问问题 b. ...

  9. Java中常用的原子类

    文章目录 一.什么是原子类 二.原子类的底层实现 三.常用的原子类 3.1.AtomicInteger与AtomicLong 3.2.LongAdder 四.原子类的性能测试 4.1.测试程序 4.2 ...

最新文章

  1. 正则表达式语法规则收集
  2. [转载]Linux从程序到进程
  3. ubuntu 安装Gogland
  4. oracle 并行执行 杀掉会话,oracle – 为什么即使我禁用并行DML和并行DDL也会创建并行会话...
  5. 软件测试流程-全程软件测试【全思维导图】最新总结
  6. QuickSort的基本CPU实现代码
  7. 信息安全技术 网络安全漏洞分类分级指南(GB/T 30279-2020 )
  8. 软件架构设计说明书该怎么写?
  9. 学校机房计算机类型,学校计算机机房的管理和维护建议原稿(样例3)
  10. 使用python把普通图片生成ico图标
  11. H3C无线网络延时大、数据丢包,不能上网,原来是有BUG
  12. Android 开机加速优化
  13. Python 画分布图
  14. python+FTP 批量上传文件
  15. 【云原生】AI云开发平台——AI Model Foundry介绍(开发者可免费体验AI训练模型)
  16. 2022年中国汽车事件数据记录器(EDR)市场现状研究分析与发展前景预测报告
  17. 算法竞赛入门经典 习题6-12
  18. 论文中 c.f. i.e. s.t. e.g. w.r.t. et al. etc英文缩写是什么意思
  19. PowerPC Figure – PPC入门与优化
  20. zabbix批量自动监控新华三服务器

热门文章

  1. 中国物联网产业RFID发展机遇分析
  2. 《C++游戏编程入门(第4版)》——1.11 问题讨论
  3. MapReduce V1:Job提交流程之JobTracker端分析
  4. 协议森林01 邮差与邮局 (网络协议概观)
  5. VMware 安装ubuntu 18.04遇到的问题
  6. 2015-12-15 关于数量个
  7. Openjudge-计算概论(A)-求分数序列和
  8. 计算从ios照片库中选取的图片文件大小
  9. 我的服装DRP之即时通讯——为WCF增加UDP绑定(应用篇)
  10. 给我一个兴趣点,我就能撬动一个行业