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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章