在ConcurrentHashMap源码中
@SuppressWarnings("unchecked") static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) { return (Node<K,V>)U.getObjectVolatile(tab, ((long)i << ASHIFT) + ABASE); }
获取ConcurrentHashMap链表数组下标,并没有用tab[i]而是用tabAt()方法
即使
定义为transient volatile Node<K,V>[] table;
但此定义只保证了table引用对于所有线程的可见性,但不保证table数组中的元素的修改对于所有线程是可见的,因此调用了Unsafe类中的getObjectVolatile()方法来保证