如何保证 HashMap 线程安全( 二 )


因此,一般来说我们不能使用 get 方法来判断中是否存在某个 key,而应该使用方法 。
除了不允许 null key 和 null value 而允许以外,它俩还有以下几点不同:
1)初始化容量不同: 的初始容量为 16,初始容量为 11 。两者的负载因子默认都是 0.75;
2)扩容机制不同:当现有容量大于总容量 * 负载因子时,扩容规则为当前容量翻倍,扩容规则为当前容量翻倍 + 1;
3)迭代器不同:首先,和有一个相同的迭代器,用法:
Iterator iterator = map.keySet().iterator();
的是 快速失败 fail-fast 的,那自然的也是 fail-fast 的 。但 还有另外一个迭代器,这个迭代器是 失败安全 fail-safe 的 。
1)快速失败 fail-fast:一种快速发现系统故障的机制 。一旦发生异常,立即停止当前的操作,并上报给上层的系统来处理这些故障 。
2)失败安全 fail-safe:在故障发生之后会维持系统继续运行 。顾名思义,和 fail-fast 恰恰相反,当我们对集合的结构做出改变的时候,fail-safe 机制不会抛出异常 。
引用:
【如何保证 HashMap 线程安全】#rd