Unsafe的 用法

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;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值