package com.wenc.keywords;
import java.lang.reflect.Field;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import sun.misc.Unsafe;
public class CompareAndSwapTest {
static class Target{
public int value = 10;
}
public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
//通过反射获得Unsafe实例,仅BootstrapClassLoader加载的类
//($JAVA_HOME/lib目录下jar包包含的类,如java.util.concurrent.atomic.AtomicInteger)
//才能通过Unsafe.getUnsafe静态方法获取
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
//获得Target实例域value
Field valueField = Target.class.getDeclaredField("value");
//实例化Target
Target t = new Target();
System.out.println("原始value值:" + valueField.get(t));
//获得实例域在class文件里的偏移量
final long valueOffset = unsafe.objectFieldOffset(valueField);
//第一次swap
System.out.println("第一次swap(10,20)函数返回值:" + unsafe.compareAndSwapInt(t, valueOffset, 10, 20));
System.out.println("第一次swap(10,20)后value值:" + valueField.get(t));
//第二次swap
System.out.println("第一次swap(10,20)函数返回值:" + unsafe.compareAndSwapInt(t, valueOffset, 10, 20));
System.out.println("第一次swap(10,20)后value值:" + valueField.get(t));
}
}
原始value值:10
第一次swap(10,20)函数返回值:true
第一次swap(10,20)后value值:20
第一次swap(10,20)函数返回值:false
第一次swap(10,20)后value值:20
更新值成功时输出true,反之输出false。感觉说了句废话... sign