Concurrenthashmap (CHM для короткометражных) был вновь введен в Java 1.5 в качестве альтернативы хэштату и является важным членом параллельного пакета. Перед Java 1.5, если вы хотите реализовать карту, которую можно безопасно использовать в многопоточных и одновременных программах, вы можете выбрать только хэштибельную и синхронизированную карту, потому что HashMap не безопасен для потока. Но после представления CHM у нас есть лучший выбор. CHM не только безопасен для потока, но и работает лучше, чем хэштата и синхронизированный. По сравнению с хэштибельными и синхронизированными, вся карта заблокирована, а CHM блокирует только несколько карт. CHM позволяет одновременно операции чтения при сохранении целостности данных во время операций записи с помощью синхронных замков. Мы узнали основы CHM в 5 лучших параллельных коллекциях Java от JDK 5 и 6. В этом блоге я представлю следующие моменты:
Внедрение concurrenthashmap в Java
CHM вводит сегментацию и предоставляет все функции, поддерживаемые Hashtable. В CHM многопоточности поддерживается для чтения карты и не требует никакой блокировки. Это связано с тем, что CHM разбивает карту на разные части, блокируя только ее часть при выполнении операции обновления. Согласно уровню параллелизма по умолчанию, карта делится на 16 частей и контролируется различными замками. Это означает, что до 16 потоков записи могут одновременно управлять картой. Представьте себе, что из одного потока, входящего в 16 потоков, входящих в то же время (чтение потоков почти не ограничено), улучшение производительности очевидно. Однако, поскольку некоторые операции обновления, такие как put (), remove (), putall () и clear (), только блокируют операцию, операция поиска не может гарантировать, что последние результаты будут возвращены.
Другим важным моментом является то, что когда итерация над CHM итератор, возвращаемый KeySet, является слабо последовательным и не безопасным и может не вернуть некоторые недавние изменения. Во время обхода, если содержание на массиве, которое было пройденным изменением, исключение CondurentModificationExceptoin не будет брошено.
Уровень параллелизма по умолчанию CHM составляет 16, но он может быть изменен конструктором при создании CHM. Нет сомнений в том, что уровень параллелизма представляет количество операций одновременных обновлений, поэтому, если только несколько потоков обновит карту, рекомендуется установить низкий уровень параллелизма. Кроме того, CHM также использует Reentrantlock для блокировки сегментов.
Пример метода concurrenthashmap putifabsent в Java
Много раз мы хотим вставить элементы, когда они не существуют, и обычно пишем код, как следующее
синхронизированный (map) {if (map.get (key) == null) {return map.put (key, value); } else {return map.get (key); }}Приведенный выше код легко использовать в HashMap и Hashtable, но в CHM существует риск ошибок. Это связано с тем, что CHM не блокирует всю карту во время операции пута, поэтому, когда один поток полон (k, V), другие вызовы потока получают (k) и получите NULL, что приведет к перезаписи значения одного потока, который будет перезаписан значением другого поток. Конечно, вы можете инкапсулировать код в синхронизированный кодовый блок, который сделает ваш код однопоточным, хотя и защищенным от потока. Метод Putifabsent (Key, значение), предоставленный CHM, реализует ту же функцию атомно, избегая при этом риска конкуренции с потоком выше.
Когда использовать concurrenthashmap
CHM подходит для того, когда количество читателей превышает количество читателей, и когда количество читателей больше или равное читателю, производительность CHM ниже, чем у хэштебельной и синхронизированной карты. Это связано с тем, что когда вся карта заблокирована, операция чтения ждет потока, который выполняет операцию записи до той же части, чтобы закончить. CHM подходит для изготовления кэша, инициализированного в начале программы, а затем можно получить доступ к нескольким запрашивающим потокам. Как объясняет Javadoc, CHM является хорошей альтернативой хэштату, но помните, что CHM имеет немного меньшую синхронизацию, чем хэштата.
Суммировать
Теперь мы знаем, что такое concurrenthashmap и когда использовать concurrenthashmap. Давайте рассмотрим некоторые ключевые моменты CHM.
Вышеуказанное - сценарии реализации и использования CHM в Java, я надеюсь, что это может помочь всем! Спасибо за вашу поддержку на этом сайте!