我注意到在Java 7中,集合类(在我的情况下为ConcurrentLinkedQueue)使用UNSAFE类进行交换和查找操作。
偏移量似乎是在编译时声明中计算的:

itemOffset = UNSAFE.objectFieldOffset(local.getDeclaredField("item"));


在编译时我们没有确切的参数化类型的情况下,例如,当我们尝试将苹果插入声明中具有Collection<? super Apple>的方法时,这将如何工作?

它是否使用“ Apple”作为声明的类来计算偏移量?
在这里理解UNSAFE用来计算偏移量的方式会有所帮助。

最佳答案

Jave不允许我们将基本类型用作泛型的类型参数,仅允许引用类型。引用类型存储为始终具有相同大小的引用,因此某些通用类的对象的内部表示始终相同,无论如何对其进行参数化。

因此,集合项的确切类型无关紧要,因为item是始终具有相同大小的引用。

关于java - 在集合中使用UNSAFE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20584970/

10-10 04:50