[java] Как работает ConcurrentHashMap внутри?



1 Answers

ConcurrentHashMap очень похож на класс java.util.HashTable , за исключением того, что ConcurrentHashMap предлагает лучший параллелизм, чем HashTable или synchronizedMap . ConcurrentHashMap не блокирует карту, пока вы читаете ее. Кроме того, ConcurrentHashMap не блокирует всю Map при записи на нее. Он только фиксирует часть Map , которая записывается внутри, внутри.

Другое отличие состоит в том, что ConcurrentHashMap не бросает ConcurrentModificationException если ConcurrentHashMap изменяется при повторении. Iterator не предназначен для использования более чем одним потоком, хотя в то время как synchronizedMap может вызывать ConcurrentModificationException

Question

Я читал официальную документацию Oracle о параллелизме в Java, и мне было интересно узнать, какая разница между Collection возвращаемой

public static <T> Collection<T> synchronizedCollection(Collection<T> c);

и использование, например,

ConcurrentHashMap . Я предполагаю, что я использую synchronizedCollection(Collection<T> c) на HashMap . Я знаю, что в общем случае синхронизированная коллекция по существу является просто декоратором для моего HashMap поэтому очевидно, что ConcurrentHashMap имеет что-то другое в своих внутренних компонентах. У вас есть информация об этих деталях реализации?

Правка: я понял, что исходный код общедоступен: ConcurrentHashMap.java




«Проблемы масштабируемости» для Hashtable присутствуют точно так же в Collections.synchronizedMap(Map) - они используют очень простую синхронизацию, а это означает, что только один поток может одновременно получить доступ к карте.

Это не большая проблема, когда у вас есть простые вставки и поиск (если вы не делаете это чрезвычайно интенсивно), но становится большой проблемой, когда вам нужно перебирать всю карту, что может занять много времени для большой карты - пока один поток делает это, все остальные должны ждать, хотят ли они вставлять или искать что-либо.

ConcurrentHashMap использует очень сложные методы для уменьшения необходимости синхронизации и обеспечения параллельного доступа для чтения несколькими потоками без синхронизации и, что более важно, предоставляет Итератор, который не требует синхронизации и даже позволяет изменять Карту во время взаимодействия (хотя он не дает никаких гарантий будут ли возвращены элементы, вставленные во время итерации).




Related