Search code examples
javamultithreadingconcurrenthashmap

Concurrent hashmap simultaneous insertion


I have read that in concurrent hashmap in Java, simultaneous insertions are possible because it is divided into segments and separate lock is taken for each segment. But if two insertions are going to happen on same segment, then these simultaneous will not happen. My question is what will happen in such a case? Will second insertion waits till first one gets completed or what?


Solution

  • In general you don't need be too concerned how ConcurrentHashMap is implemented. It simply complies to the the contract of ConcurrentMap which ensures that concurrent modifications are possible.

    But to answer your question: yes, one insertion may wait for completion of the other one. Internally, it uses locks which ensure that one thread is waiting until the other one releases the lock. Class Segment used internally actually inherits from ReentrantLock. Here is a shortened version of Segmenet.put():

    final V put(K key, int hash, V value, boolean onlyIfAbsent) {
        HashEntry<K,V> node = tryLock() ? null : scanAndLockForPut(key, hash, value);
        V oldValue;
        try {
           // modifications
        } finally {
            unlock();
        }
        return oldValue;
    }
    
    private HashEntry<K,V> scanAndLockForPut(K key, int hash, V value) {
        // ...
        int retries = -1; // negative while locating node
        while (!tryLock()) {
            if (retries < 0) {
                // ...
            }
            else if (++retries > MAX_SCAN_RETRIES) {
                lock();
                break;
            }
            else if ((retries & 1) == 0 && (f = entryForHash(this, hash)) != first) {
                e = first = f; // re-traverse if entry changed
                retries = -1;
            }
        }
        return node;
    }
    

    This could give you an idea.