java中的AtomicInteger的详细原理

这个原理在网上搜索了很多都没搞清楚真正原因,后来参照了一个帖子彻底解决了我的疑问:https://blog.csdn.net/qq_34115899/article/details/83018870

1、首先确定实例域(变量int value)在class文件中的偏移量位置。这个偏移量设置在valueOffset中,即如下代码

2、当调用

当外部调用incrementAndGet或addAndGet等方法时,会调用下面这个方法:这个getIntVolatile方法是根据传入的当前对象和偏移量,c++就会从主内存中寻找这个对象地址并且根据偏移量找出里面的值域(即value),这个值也就是主内存中的最新值。

compareAndSwapInt方法有四个参数,第一个参数这个当前对象,第二个是需要操作这个对象中的值域的偏移量,第三个参数v代表当前线程的预期值,第四个参数代表需要修改为什么值。compareAndSwapInt方法调用c++的方法会根据你传入的预期值和主存中的值进行比较如一样则把主存中这个地址上的对象中指定偏移量的值改为你传入的新值。还有为什么c++就能保证这种原子性操作,是因为cpu的指令是一条条执行的,不会多条指令对一个地址进行操作。

  CAS的缺点:
    1、出现ABA问题:Java 提供了 AtomicStampedReference 工具类,通过为引用建立类似版本号(stamp)的方式,将值和stamp一起进行让c++去比较,来保证 CAS 的正确性。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值