Lock Stripping

Instead of a single lock, we used multiple locks. Each lock manages a regions. For example in ConcurrentHashMap, it devides into 16 segments.

@ThreadSafe  
public class ConcurrentHashMapMock<K, V> {  
    private Map<K, V> map = new HashMap<>();  
    private final Object[] locks = new Object[16];  
  
    public void put(K key, V value) {  
        int lock = key.hashCode() % locks.length;  
        synchronized (locks[lock]) {  
            map.put(key, value);  
        }  
    }  
}