关于AtomicStampedReference使用的坑

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

关于AtomicStampedReference使用的坑_第1张图片


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

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

关于AtomicStampedReference使用的坑_第2张图片

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

关于AtomicStampedReference使用的坑_第3张图片

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

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

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

关于AtomicStampedReference使用的坑_第4张图片

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

    

你可能感兴趣的:(java基础)