AtomicInteger作用 ,原理

AtomicInteger是Java并发包(java.util.concurrent.atomic)中的一个原子类,它提供了一种线程安全的方式来更新整型变量。它的作用和原理主要包括以下几点:

作用

  1. 线程安全的整数自增/自减AtomicInteger允许我们进行原子性的整数操作,如incrementAndGet()decrementAndGet()等,这些操作在多线程环境下是线程安全的,即在执行这些操作的过程中,不会被其他线程打断,确保了数据的完整性。

  2. 原子更新不仅仅是自增/自减操作,还包括getAndSet()compareAndSet()等方法,都能确保在多线程环境下对整数进行原子性地读取、修改和返回操作。

  3. 避免锁相比传统的使用synchronized关键字实现同步,AtomicInteger通过CAS(Compare-and-Swap)等硬件级别的指令实现无锁操作,减少了锁带来的上下文切换开销,提升了并发性能。

        原理 AtomicInteger的实现主要依赖于CAS(Compare and Swap)操作,这是一种CPU级别的原子指令,可以保证在没有其他线程干扰的情况下更新共享变量的值。当一个线程试图修改AtomicInteger的值时,它会比较当前值和期望值,只有在两者相等的情况下才会将值更新为新的目标值。如果在这期间有其他线程改变了变量的值,则更新操作会失败,线程可以选择重新尝试,直至成功为止。

        在Java的实现中,AtomicInteger内部维护了一个volatile int类型的变量,volatile关键字保证了多线程环境下对这个变量的访问具有可见性,即一个线程修改了AtomicInteger的值,其他线程可以立即看到这个修改。同时,通过Unsafe类提供的CAS操作实现对这个变量的原子性修改。

        例如,当我们调用AtomicInteger.incrementAndGet()方法时,实际上是在背后执行了一系列的CAS操作来确保增量操作的原子性,而不是简单地将值加1。这种无锁机制使得AtomicInteger在高并发场景下表现得更为高效。

在现实生活中,AtomicInteger的作用和原理可以类比于一个银行账户余额的更新操作。

作用:

         想象一个家庭的银行账户,家庭成员(代表多线程)可以随时向账户存款或取款。如果我们用普通变量来表示这个账户余额,当多个成员同时进行操作时,如果不采取任何同步措施,可能会出现数据不一致的情况(比如两人同时取款,但最终余额却没有减少两次)。

   AtomicInteger在这里的作用就像是一个具备高级功能的银行系统,它确保了无论多少家庭成员同时操作,账户余额的更新总是原子性的,也就是说,每一次存款或取款操作都是独立完成且不会被其他操作打断,这样一来,家庭成员在任何时刻查看账户余额,都能得到正确的数值。

原理: 

        银行柜员在处理转账事务时,必须遵循严格的步骤,确保在更新余额前检查现有余额,更新后再保存新的余额。这类似于AtomicInteger在更新值时采用的CAS(Compare and Swap)机制。

想象这样一个情景:

  1. 家庭成员A打算从账户取款100元,首先查看当前余额。
  2. 银行系统使用CAS指令,比较当前余额与上次A查看时的余额是否一致。
  3. 如果一致,系统将立即扣款并将新的余额保存到账上;如果不一致,说明在此期间有其他成员进行了操作,系统会让A重新查看当前余额并再次尝试扣款。

        通过这种方式,AtomicInteger就像一个智能的银行出纳员,确保了在多个人(线程)同时操作一个共享资源(银行账户余额)时,始终能够正确地进行原子操作,防止了数据竞争导致的不一致问题。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值