???????????????????·???????????CPU????????????????????·???????Σ????????Java?????????????????HashMap???Race Condition?????????????????????????4??5?????????????????????????д??????Java??HashMap?????????????????????±?????????????????????????????????????????£????????“HashMap Infinite Loop”????????????????????£??????????????????????????д?????????????????£?????????????????????“Race Condition”??????γ???

???????????

????????????Java????????Щ????????HashMap??????????????????????????????ж?????????????????????????????????????????????????????????????????????????????????CPU?????????????????Hang????HashMap.get???????????????????????????????????????????????????????????????????????????????????

??????????????????????????????????HashMap???????????????Java??????HashMap????????????????ConcurrentHashMap??

????????????????????????о???????

????Hash???????

?????????????????HashMap???????????????

????HashMap????????????????饗?????table[]????????????е?key???????key??????????????Hash?????key????????????±?i??????????嵽table[i]?У???????????????key????????????i??????г????????????????????table[i]???γ?????????

????????????????table[]?????С?????????2???????????10??keys??????????????????????????O??1?????????????????????????????????O??n????????Hash?????????ο???Hash Collision DoS ????????

?????????Hash????????????????????????????Hash???????????????????????????????????????г????趨??thredhold??????????????????Hash????磬?????????????????Hash?????????????????????顣???rehash?????????????

???????????????????????????????

????HashMap??rehash?????

???????棬???????????Java??HashMap???????

????Put???Key??Value???Hash???У?

    public V put(K key?? V value)
    {
        ......
        //??Hash?
        int hash = hash(key.hashCode());
        int i = indexFor(hash?? table.length);
        //?????key??????????滻????value ???????????
        for (Entry e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
        modCount++;
        //??key????????????????????
        addEntry(hash?? key?? value?? i);
        return null;
    }

????????????????

    void addEntry(int hash?? K key?? V value?? int bucketIndex)
    {
        Entry e = table[bucketIndex];
        table[bucketIndex] = new Entry(hash?? key?? value?? e);
        //???????size????????????趨?????threshold??????????????resize
        if (size++ >= threshold)
            resize(2 * table.length);
    }

?????????????????hash???????????????Hash?????????μ?Hash???С?

    void resize(int newCapacity)
    {
        Entry[] oldTable = table;
        int oldCapacity = oldTable.length;
        ......
        //????????μ?Hash Table
        Entry[] newTable = new Entry[newCapacity];
        //??Old Hash Table???????????New Hash Table??
        transfer(newTable);
        table = newTable;
        threshold = (int)(newCapacity * loadFactor);
    }