参考链接:https://www.cnblogs.com/williamjie/p/9099861.html
HashTable和ConcurrentHashMap的区别
- HashTable使用数组+链表实现,ConcurrentHashMap使用的数组+链表+红黑树实现。
- HashTable锁住的是整张表,ConcurrentHashMap仅锁一个Node,因为ConcurrentHashMap定义了3个原子操作,用于对指定位置的节点进行操作。
//获得在i位置上的Node节点
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);
}
//利用CAS算法设置i位置上的Node节点。之所以能实现并发是因为他指定了原来这个节点的值是多少
//在CAS算法中,会比较内存中的值与你指定的这个值是否相等,如果相等才接受你的修改,否则拒绝你的修改
//因此当前线程中的值并不是最新的值,这种修改可能会覆盖掉其他线程的修改结果 有点类似于SVN
static final <K,V> boolean casTabAt(Node<K,V>[] tab, int i,
Node<K,V> c, Node<K,V> v) {
return U.compareAndSwapObject(tab, ((long)i << ASHIFT) + ABASE, c, v);
}
//利用volatile方法设置节点位置的值
static final <K,V> void setTabAt(Node<K,V>[] tab, int i, Node<K,V> v) {
U.putObjectVolatile(tab, ((long)i << ASHIFT) + ABASE, v);
}
- ConcurrentHashMap的读不加锁,因为HashEntry的Value用volatile修饰。
- ConcurrentHashMap的size()是个大概值。