我注意到在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/