importjava.lang.reflect.Field;importcom.alibaba.fastjson.JSON;importcom.guo.util.Util;importsun.misc.Unsafe;/*** unsafe 操作数组
*@authorGuoJunWei
**/
public classTest1 {public static Unsafe unsafe =Util.getUnsafe();public static void main(String[] args) throwsException {//function1();//function2();//function3();//function4();//function5();
function6();
}/*** park():方法返回条件
* 1 当前现在调用过 unpark 方法 (多次调用 按照一次计算)
* 2 当前线程被中断
* 3 当park 为 false:时间块到了 单位纳秒
* 4 当park 为 true:时间是绝对时间(1970)年 到期 单位毫秒*/
public static voidfunction6() {
System.out.println("Start");long time = System.currentTimeMillis()+3000l;
unsafe.park(true,time);
System.out.println("end");
}/*** CAS操作
*@throwsException*/
public static void function5() throwsException {
Player player= (Player) unsafe.allocateInstance(Player.class);
Field age= player.getClass().getDeclaredField("age");long addressAge =unsafe.objectFieldOffset(age);
unsafe.compareAndSwapInt(player, addressAge,0, 100);
System.out.println(player.getAge());
}/*** 直接分配内存地址:内存管理*/
public static voidfunction4() {//分配100字节内存 返回初始地址
long address = unsafe.allocateMemory(100);//往分配的内存地址写入值
unsafe.putInt(address, 55);//获取值
System.out.println(unsafe.getInt(address));//分配100字节内存 返回初始地址
long address1 = unsafe.allocateMemory(100);//copy 内存值
unsafe.copyMemory(address, address1, 4);
System.out.println(unsafe.getInt(address1));//释放内存
unsafe.freeMemory(address);
unsafe.freeMemory(address1);
}/*** 操作对象属性值
*@throwsException*/
public static void function3() throwsException {
Player player= (Player) unsafe.allocateInstance(Player.class);
Field fieldName= player.getClass().getDeclaredField("name");
Field fieldAge= player.getClass().getDeclaredField("age");long fileNameaddres =unsafe.objectFieldOffset(fieldName);long fileAgeaddres =unsafe.objectFieldOffset(fieldAge);
unsafe.putObjectVolatile(player, fileNameaddres,"wangWu");
unsafe.putInt(player,fileAgeaddres,100);
System.out.println(player.getAge()+" "+player.getName());
}/*** 实例化对象
*@throwsInstantiationException*/
public static void function2() throwsInstantiationException {
Player player= (Player) unsafe.allocateInstance(Player.class);
player.setAge(100);
player.setName("zhangShan");
System.out.println(player.getAge()+" "+player.getName());
}/*** 对数组的操作*/
public static voidfunction1() {int[] num = new int[7];//数组的起始地址
long adress = unsafe.arrayBaseOffset(int[].class);//block 大小
long index = unsafe.arrayIndexScale(int[].class);
unsafe.putInt(num, adress,1);
unsafe.putInt(num, adress+index, 2);
unsafe.putInt(num, adress+index+index, 3);
unsafe.putInt(num, adress+index+index+index, 4);
System.out.println(JSON.toJSONString(num));
}
}