SparkSQL10_Unsafe相关_01_sun.misc.Unsafe

来源:互联网 发布:80端口 屏蔽 通知 编辑:程序博客网 时间:2024/05/16 06:04

1. Unsafe.copyMemory

1.1 如下代码实现字节数组的拷贝

import sun.misc.Unsafe;import java.lang.reflect.Field;public class UnsafeTest {    private static final Unsafe _UNSAFE;    private static final int BYTE_ARRAY_OFFSET;    private static final int INT_ARRAY_OFFSET;    static {        sun.misc.Unsafe unsafe;        try {            //通过反射获得Unsafe类的theUnsafe成员变量            Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");            //设置为可访问            unsafeField.setAccessible(true);            //theUnsafe是静态变量,可以通过null对象获取其值,获得的值就是Unsafe成员变量            unsafe = (sun.misc.Unsafe) unsafeField.get(null);        } catch (Throwable cause) {            cause.printStackTrace();            unsafe = null;        }        _UNSAFE = unsafe;        BYTE_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(byte[].class);        INT_ARRAY_OFFSET = _UNSAFE.arrayBaseOffset(int[].class);    }    public static void main(String[] args) {        System.out.println("======================BYTE ARRAY=======================");        byte[] src = new byte[]{1, 2, 3, 4, 5, 6};        byte[] dest = new byte[src.length];        _UNSAFE.copyMemory(src, BYTE_ARRAY_OFFSET, dest, BYTE_ARRAY_OFFSET, src.length);        for (byte b : dest) {            System.out.println(b);        }        System.out.println("=======================INT ARRAY=======================");        int[] isrc = new int[]{11,12,13,14,15,16};        int[] idest = new int[isrc.length];        _UNSAFE.copyMemory(isrc, INT_ARRAY_OFFSET, idest, INT_ARRAY_OFFSET,isrc.length * 4); //最后一个参数表示复制内存的长度        for (int ii : idest) {            System.out.println(ii);        }    }}




0 0
原创粉丝点击