在Unsafe中对其他原始类型使用Unsafe.getByte(byte[], long)
或Unsafe.putByte(long, byte[])
或任何其他get / put方法时,我将得到NullPointerException。
以下是代码段:
byte[] data = new byte[]{0, 0, 0, 0, 0};
long offset = 0;
Unsafe unsafe = getUnsafe();
public byte at(long index) {
return unsafe.getByte(data, index + this.offset);
}
*所有字段都正确实例化 *方法getUnsafe()将返回一个Unsafe类实例。
答案 0 :(得分:1)
如果我尝试使用您的代码,我会java.lang.SecurityException
获得Unsafe.getUnsafe()
。如果您以某种方式忽略该异常,unsafe
可能最终成为null
,这可能是您例外的原因。
如果我改为使用以下代码初始化unsafe
:
Unsafe unsafe = null;
try {
Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (sun.misc.Unsafe) field.get(null);
} catch (Exception e) {
throw new AssertionError(e);
}
一切正常,如果我将at(...)
设置为16,我可以使用你的offset
函数来访问数组中的字节。也许试一试,看看是否有帮助。
但是!!! (正如@StephenC上面所述),你应该尽量避免使用这种方法!例如,您可能无法依赖应用于所有VM的offset
的特定值。此外,在某些疯狂的情况下,某些VM甚至可能决定对数组中的字节进行字对齐,这样您需要将index
增加4或8才能到达下一个字节(这是猜测)。此功能可能非常难以预测。我还怀疑它比使用data[index]
要快得多,因为你刚刚在代码中引入了一个方法调用。如果您需要速度,请务必查看direct NIO ByteBuffers。