前几天我偶然发现了一个不安全的包装,它的功能让我感到惊讶。

当然,这个类是没有记录的,但是我想知道是否有一个很好的理由使用它。可能会出现哪些需要使用它的场景?如何在现实场景中使用它?

此外,如果您确实需要它,这难道不表明您的设计可能存在问题吗?

为什么Java包含这个类?


当前回答

为了有效地复制内存(至少对于短块,复制速度比System.arraycopy()快);由Java LZF和Snappy编解码器使用。它们使用'getLong'和'putLong',这比逐字节复制要快;在复制16/32/64字节块时尤其有效。

其他回答

not safe.park()和not safe.unpark()用于构建自定义并发控制结构和协作调度机制。

对象的可用性似乎低于Java代码通常允许的级别。如果您正在编写一个高级应用程序,那么JVM将内存处理和其他操作从代码级别抽象出来,因此更容易编程。通过使用不安全库,您可以有效地完成通常由您完成的低级操作。

正如woliveirajr所述,“random()”使用Unsafe来播种,就像许多其他操作将使用Unsafe中包含的allocateMemory()函数一样。

作为程序员,你可能永远不需要这个库,但严格控制底层元素确实很方便(这就是为什么在主要产品中仍然有汇编代码和(在较小程度上)C代码的原因)

有趣的是,我甚至从未听说过这个类(这可能是一件好事,真的)。

我想到的一件事是使用Unsafe#setMemory将包含敏感信息的缓冲区归零(密码、密钥等)。您甚至可以对“不可变”对象的字段执行此操作(然后,我再次假设普通的反射也可以在这里执行此操作)。但我不是安全专家,所以对此持保留态度。

堆外集合对于分配大量内存并在使用后立即释放内存而不受GC干扰可能很有用。我基于sun.misc.Unsafe编写了一个用于处理堆外数组/列表的库。

它使用的一个例子是random方法,该方法调用不安全的方法来更改种子。

这个网站也有它的一些用途。