java并发编程JUC第十二篇:AtomicInteger原子整型,太赞了

AtomicInteger atomicInteger = new AtomicInteger();

//初始值为200的atomicInteger对象

AtomicInteger atomicInteger = new AtomicInteger(200);

int currentValue = atomicInteger.get(); //100

atomicInteger.set(2453); //现在的值是 2453




但是上面的方法,对于`AtomicInteger`而言并不是它的核心内容,`AtomicInteger`核心内容体现在它的原子性,我们下文介绍。



[]( )2\. 什么时候需要使用AtomicInteger

----------------------------------------------------------------------------------



我们通常在以下的两种场景下使用`AtomicInteger`



1.  多线程并发场景下操作一个计数器,需要保证计数器操作的原子性。

2.  进行数值比较,如果给定值与当前值相等,进行数值的更新操作,并实现操作的非阻塞算法。



#### []( )2.1. 原子计数器场景



把`AtomicInteger`作为一个计数器使用,`AtomicInteger`提供了若干方法进行加法、减法的原子操作。



> 比如从一个map里面获取值,用get()方法,这是第一个操作;获取到值之后给这个值加上n,这是第二个操作;将进行过加法运算的值,再次放入map里面是第三个操作。所谓操作的原子性是指:在多线程并发的场景下,上面的三个操作是原子性的,也就是不可分割的。不会出现A线程get了数值,B线程同时也get到了该数值,两个线程同时为该值做运算并先后再次放入的情况,这种情况对于`AtomicInteger`而言是不会出现的,`AtomicInteger`操作是线程安全的、不可分割的。



*   `addAndGet()`\- 将给定的值加到当前值上,并在加法后返回新值,并保证操作的原子性。

*   `getAndAdd()`\- 将给定的值加到当前值上,并返回旧值,并保证操作的原子性。

*   `incrementAndGet()`\- 将当前值增加1,并在增加后返回新值。它相当于`++i`操作,并保证操作的原子性。

*   `getAndIncrement()`\- 将当前值增加1并返回旧值。相当于`++i`操作,并保证操作的原子性。

*   `decrementAndGet()`\- 将当前值减去1,并在减去后返回新值,相当于`i--`操作,并保证操作的原子性。

*   `getAndDecrement()`\- 将当前值减去1,并返回旧值。它相当于 `--i`操作,并保证操作的原子性。



下面是AtomicInteger原子性操作方法的例子



public class Main {

public static void main(String[] args) {

    //初始值为100的atomic Integer

    AtomicInteger atomicInteger = new AtomicInteger(100);

     

    System.out.println(atomicInteger.addAndGet(2));         //加2并返回102

    System.out.println(atomicInteger);                      //102

     

    System.out.println(atomicInteger.getAndAdd(2));         //先获取102,再加2

    System.out.println(atomicInteger);                      //104

     

    System.out.println(atomicInteger.incrementAndGet());    //加1再获取105   

    System.out.println(atomicInteger);                      //105   

             

    System.out.println(atomicInteger.getAndIncrement());    //先获取105再加1

    System.out.println(atomicInteger);                      //106

     

    System.out.println(atomicInteger.decrementAndGet());    //减1再获取105

    System.out.println(atomicInteger);                      //105

     

    System.out.println(atomicInteger.getAndDecrement());    //先获取105,再减1

    System.out.println(atomicInteger);                      //104

}

}




#### []( )2.2. 数值比对及交换操作



compareAndSet操作将一个内存位置的内容与一个给定的值进行比较,只有当它们相同时,才会将该内存位置的内容修改为一个给定的新值。这个过程是以单个原子操作的方式完成的。



compareAndSet方法:如果`当前值==预期值`,则将值设置为给定的更新值。



boolean compareAndSet(int expect, int update)




**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/f691e7614cdf8cd26fda9b08ac672369.jpeg)
![img](https://img-blog.csdnimg.cn/img_convert/a79fb83b0cd0ce007f130e25a002bd06.png)
![img](https://img-blog.csdnimg.cn/img_convert/37b2e73fd3bf25304bf46ffea1c2c59d.png)
![img](https://img-blog.csdnimg.cn/img_convert/4cd3b5ce0c4a55786ecb1437dda10448.png)
![img](https://img-blog.csdnimg.cn/img_convert/d88056e8efb060ea4e4b1f420bb7c364.png)
![img](https://img-blog.csdnimg.cn/img_convert/f6336d03b40c03eabe9f3e5aa72fb8d4.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)**
![img](https://img-blog.csdnimg.cn/img_convert/d36499ed5b4a2c475e46ab8d1f39ee39.jpeg)



# **结尾**

![查漏补缺:Java岗 千+道面试题Java基础+全家桶+容器+反射+异常等](https://img-blog.csdnimg.cn/img_convert/d8b38852b6897ab1845e8ad2e388ff79.webp?x-oss-process=image/format,png)

这不止是一份面试清单,更是一种”被期望的责任“,因为有无数个待面试者,希望从这篇文章中,找出通往期望公司的”钥匙“,所以上面每道选题都是结合我自身的经验于千万个面试题中经过艰辛的两周,一个题一个题筛选出来再次对好答案和格式做出来的,面试的答案也是再三斟酌,深怕误人子弟是小,影响他人仕途才是大过,也希望您能把这篇文章分享给更多的朋友,让他帮助更多的人,帮助他人,快乐自己,最后,感谢您的阅读。

**由于细节内容实在太多啦,在这里我花了两周的时间把这些答案整理成一份文档了,在这里只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!**


[**一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)

**AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值