一、引子
这篇文章用于记录我在尝试测试使用
CAS
机制下的
compareAndSwapObject
方法所遇到的问题:我的目的是想通过
compareAndSwapObject
方法调用是否能够满足“若不相同,则不更新”的性质,但是发现其总是返回false,后来意识到是int值自动装箱所导致的问题。接下来就来看代码吧。
compareAndSwapObject
方法简介:
/**
* compareAndSwapObject(Object var1, long var2, Object var3, Object var4)
* var1 操作的对象
* var2 操作的对象属性
* var3 var2与var3比较,相等才更新
* var4 更新值
*/
二、int属性值使用
compareAndSwapObject
方法遇到的自动装箱问题
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 版权协议,转载请附上原文出处链接和本声明。