前置关键词
- segments 分段(jdk1.7)
老生常谈
- jdk1.7 采用 Segment数组(segments),每个 Segment都有独立的 ReentrantLock锁,并发操作互不影响
- jdk1.8 CAS + synchronized 实现每个 Node一个锁,缩小了锁粒度,提高了并发性能
加锁
并发情况下,HashMap 存在线程不安全的情况,线程不安全,当然要加锁了。
HashTable
2021年3月28日大约 4 分钟
并发情况下,HashMap 存在线程不安全的情况,线程不安全,当然要加锁了。
capacity:容量,也就是数组的长度,扩容扩的也是数组的长度避免链表分布不均,链表过长,通过红黑树,自平衡,稳定的树高
public class HashMap`<K, V>` extends AbstractMap`<K, V>`
implements Map`<K, V>`, Cloneable, Serializable {
/* 默认容量 16 */
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
/* 最大容量 2^30 */
static final int MAXIMUM_CAPACITY = 1 << 30;
/* 负载因子 */
static final float DEFAULT_LOAD_FACTOR = 0.75f;
/* 树化阈值(链表 > 红黑树) */
static final int TREEIFY_THRESHOLD = 8;
/* 取消树化阈值(红黑树 > 链表) */
static final int UNTREEIFY_THRESHOLD = 6;
/* 如果容量小于 64,链表是不会转为红黑树的,而是会扩容 */
static final int MIN_TREEIFY_CAPACITY = 64;
}