千家信息网

AtomicInteger、AtomicBoolean、AtomicLong原子类怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,小编给大家分享一下AtomicInteger、AtomicBoolean、AtomicLong原子类怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!我们知道在多线程中如果操作的是
千家信息网最后更新 2026年11月03日AtomicInteger、AtomicBoolean、AtomicLong原子类怎么用

小编给大家分享一下AtomicInteger、AtomicBoolean、AtomicLong原子类怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

我们知道在多线程中如果操作的是实例变量那么就有可能出线线程安全问题。代码如下:

我们看两个线程输出的count值都是0这显然是不正确的,原因就是因为++这个操作符不是一个原子操作。我们可以把这个操作符拆分开来看一下它的实现逻辑。

按照上面表达式count++要经历3个必要的步骤:

  1. 首先要获取count的值,

  2. 计算count+1的值

  3. 在然后将计算后的值赋值给count。

并且我们还知道count++操作是后置运算符,也就是说JVM在处理这种操作的时候,是先输出值然后在将计算后的值赋值给count的。也就是说如果我们没有用多线程只有单线程执行的话,那么程序的运行结果一直都是0,原因就是因为count++这个++符号在后面,所以是先输出在赋值的,也就是在输出完才将count的值加1。

我们看如果只有一个线程的话,count++输出的值一定是0,并不是因为没有执行++操作,只是这个++操作是在输出之后才赋值的,所以如果想看++操作执行后的值,那么我们在输出一次count的值就可以了。

在回到我们刚刚说的多线程的问题上,如果同时有两个以上的线程都执行count++操作,它们的步骤就有可能是(多线程的执行结果是不固定的)线程一先获取到count值因为它是实例变量,所以JVM会初始化默认的值也就是0。那么此时线程一获取到的count值就是0,又因为++操作是后置运算符,所以JVM会先输出在执行运算赋值。所以线程一就会先输出0,但这时有可能线程二也执行了count++。也就是说线程一还没有输出呢,线程二就执行了,它执行的过程和上面的一样,先获取count然后输出。有可能线程二执行的比较快,比线程一先执行完,所以输出结果就有可能先输出线程二的后输出线程一,但它们的结果都可能是0,这也是count++不是原子操作的体现。下面我们看一下具有原子操作的类AtomicInteger、AtomicBoolean、AtomicLong。这三个类的的方法使用都是一样的,我们重点看一下AtomicInteger类的使用。它为我们提供了很多原子操作的方法。具体如下:

这里面有很多支持原子操作的方法,这里就不一一介绍了,具体使用的时候可以查相关的API文档。下面我们将详细介绍一下上面的3个方法。上面遇到的线程安全问题是因为执行count++操作的时候因为不是原子操作,多个线程可以同时执行,才导致的线程安全问题。现在我们将代码修改为支持原子操作的getAndIncrement()方法在执行一下上面的代码看一下结果会怎么样。

我们看这回没有线程安全的问题了,原因是getAndIncrement()方法是一个原子操作的方法,线程在执行时是不能中断的。那getAndIncrement()方法是怎么实现原子操作的呢,我们下面来分析一下getAndIncrement()方法的源码。

我们看到源码中第一条语句就是一个死循环,也就是说如果赋值操作失败,它会一直循环执行。get()的作用是获取当前AtomicInteger类中的值。然后将获取的AtomicInteger类中的值执行加1运算。最重要的就是这个compareAndSet方法,我们知道这个方法的作用是将AtomicInteger类中的值与预期值做比较,如果相等,那就把AtomicInteger类中的值设置为方法参数的值,并且这个方法也是原子操作,不会有线程的安全问题。如果compareAndSet方法返回false。说明get()方法获取的值不是最新的了,也就是说有其它线程已经对AtomicInteger类中的值与做了修改了,那么方法就会一直执行循环,然后继续判断,一直到compareAndSet方法返回ture时为止,这也就是getAndIncrement()方法实现原子操作的逻辑。我们继续看一下addAndGet()方法的源码。

我们发现addAndGet()方法和getAndIncrement()方法的大体逻辑一样,只是一个是执行加1运算一个是执行加参数运算,具体的原理就向上面分析的一样,这里就不在详细介绍了。总之,如果在多线程中如果有数据运算等操作,那么最好是用Java为我们提供的原子操作类,它可以帮我们解决很多线程安全的问题。

看完了这篇文章,相信你对"AtomicInteger、AtomicBoolean、AtomicLong原子类怎么用"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

线程 方法 原子 输出 也就是 问题 运算 安全 也就是说 就是 结果 代码 原因 时候 源码 逻辑 面的 循环 两个 作用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中智农互联网科技 金融科技还是互联网 互联网科技与金融科技 朗涯互联网科技 科技创新互联网企业 广州慧亚互联网科技怎么样 全球顶尖互联网科技公司 崇明区互联网教育科技诚信经营 科技类公司包括互联网吗 中国科技创新与世界互联网大会 迪庆互联网科技招生 明优互联网科技有限公司 卓翼科技产业互联网合作 互联网第三次科技革命特征 互联网企业科技类企业如何做账 扫呗互联网科技有限公司 互联网公司属于科技吗 米泉互联网科技专业怎么样 科技互联网专业工作会议发言稿 陕西彩京云互联网科技有限公司 保险科技 互联网保险 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会 高科技与互联网 哈尔滨新华互联网科技 互联网科技博主是什么意思 南博望互联网科技有限公司 领航科技大厦互联网公司 众联互联网络科技 优雇互联网科技有限公司
0