关于AtomicStampedReference使用的坑

AtomicStampedReference用来解决AtomicInteger中的ABA问题,该demo企图将integer的值从0一直增长到1000,但当integer的值增长到128后,将停止增长。出现该现象有两点原因:1、使用int类型而非Integer保存当前值,2、Interger对-128~127的缓存



查看compareAndSet方法。expectedReference为引用类型V,此处为Integer。

当int类型的current传入compareAndSet方法时,会被装箱成Integer类型与expectedReference进行==比较。

装箱过程是调用Integer的valueOf方法。看看Integer的valueOf方法。

Integer对-128~127间的数字有缓存,所以在此区间的current==expectedReference为true,当current>127,每次装箱将返回新的Integer对象,此时current!=expectedReference导致compareAndSet一直返回false。

改用Integer接收current后,问题解决,因为current与expectedReference始终为同一Integer对象。

当然也可以不用中间变量存储当前值,直接如图,不会有问题。


timeStamp为什么不存在这个问题,因为compareAndSet方法中使用int接收的。不存在装箱过程。

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值