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);
}
}
}