package com.test.jdk.curren;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class UnsafeTest {
private static Unsafe unsafe;
static {
try {
//通过反射获取rt.jar下的Unsafe类
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (Exception e) {
System.out.println("Get Unsafe instance occur error"+ e);
}
}
public static void main(String[] args) throws Exception
{
Class clazz = Target.class;
Field[] fields = clazz.getDeclaredFields();
System.out.println("字段名称:字段位置");
for (Field f : fields) {
// 获取属性偏移量,可以通过这个偏移量给属性设置
System.out.println(f.getName() + ":" + unsafe.objectFieldOffset(f));
}
Target target = new Target();
Field intFiled = clazz.getDeclaredField("intParam") ;
int a=(Integer)intFiled.get(target ) ;
System.out.println("intParam原始值是:"+a);
//intParam的字段偏移是12 原始值是3 我们要改为10
System.out.println("修改intParam:"+unsafe.compareAndSwapInt(target, 12, 3, 10));
int b=(Integer)intFiled.get(target) ;
System.out.println("intParam改变之后的值是:"+b);
System.out.println("intParam改变之后的值是:"+target.intParam);
//这个时候已经改为10了,所以会返回false
System.out.println(unsafe.compareAndSwapInt(target, 12, 3, 10));
//修改strParam字符串为 null 为 "5"
System.out.println(unsafe.compareAndSwapObject(target, 24, null, "5"));
}
}
class Target {
int intParam=3;
long longParam;
String strParam;
String strParam2;
}
Unsafe的 用法
最新推荐文章于 2023-06-17 11:38:48 发布