Java并发-当compareAndSwapObject遇到自动装箱问题详解

  • Post author:
  • Post category:java




一、引子

这篇文章用于记录我在尝试测试使用

CAS

机制下的

compareAndSwapObject

方法所遇到的问题:我的目的是想通过

compareAndSwapObject

方法调用是否能够满足“若不相同,则不更新”的性质,但是发现其总是返回false,后来意识到是int值自动装箱所导致的问题。接下来就来看代码吧。


compareAndSwapObject

方法简介:

            /**
             * compareAndSwapObject(Object var1, long var2, Object var3, Object var4)
             * var1 操作的对象
             * var2 操作的对象属性
             * var3 var2与var3比较,相等才更新
             * var4 更新值
             */



二、int属性值使用

compareAndSwapObject

方法遇到的自动装箱问题

import sun.misc.Unsafe;

import java.lang.reflect.Field;

/**
 * @author Fisherman
 * @date 2019/9/20
 */
public class TestCAS {
   

    private volatile int a =10;
    private static final long aOffset;

    private static final sun.misc.Unsafe UNSAFE;

    static {
   
        try {
   
            UNSAFE = getUnsafe();
            Class<?> k = TestCAS.class;
            aOffset = UNSAFE.objectFieldOffset
                    (k.getDeclaredField("a"));
        } catch (Exception e) {
   
            throw new Error(e);
        }
    }

    public boolean changeA(int var1,int var2){
   
        return UNSAFE.compareAndSwapObject(this,aOffset,var1,var2);
    }

    /**
     * 获取Unsafe对象的方法
     * @return
     */
    public static Unsafe getUnsafe() {
   
        try {
   
            Field f = Unsafe



版权声明:本文为li_xunhuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。