究其原因,是因为在多线程环境下使用了非线程安全的 map 集合
    JDK 8 虽然将扩容算法做了调整,不再将元素加入链表头(而是保持与扩容前一样的顺序),但仍不意味着能够在多线程环境下能够安全扩容,还会出现其它问题(如扩容丢数据)

    1. // 将 table 迁移至 newTable
    2. void transfer(Entry[] newTable, boolean rehash) {
    3. int newCapacity = newTable.length;
    4. for (Entry<K,V> e : table) {
    5. while(null != e) {
    6. Entry<K,V> next = e.next;
    7. // 1 处
    8. if (rehash) {
    9. e.hash = null == e.key ? 0 : hash(e.key);
    10. }
    11. int i = indexFor(e.hash, newCapacity);
    12. // 2 处
    13. // 将新元素加入 newTable[i], 原 newTable[i] 作为新元素的 next
    14. e.next = newTable[i];
    15. newTable[i] = e; e = next;
    16. }
    17. }
    18. }