Учебники

Java Concurrency – интерфейс ConcurrentMap

Интерфейс java.util.concurrent.ConcurrentMap является подынтерфейсом интерфейса Map, поддерживает элементарные операции над базовой переменной map. У него есть методы get и set, которые работают как чтение и запись по переменным переменным. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. Этот интерфейс обеспечивает безопасность потока и гарантии атомарности.

Методы ConcurrentMap

Sr.No. Метод и описание
1

V вычисление по умолчанию (клавиша K, BiFunction <? super K?? super V? расширяет V> remappingFunction)

Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или ноль, если текущего сопоставления нет).

2

по умолчанию V computeIfAbsent (клавиша K, функция <? super K, extends V> mappingFunction)

Если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), он пытается вычислить его значение с использованием заданной функции сопоставления и вводит его в эту карту, если не имеет значение NULL.

3

по умолчанию V computeIfPresent (клавиша K, BiFunction <? super K,? super V, расширяет V> remappingFunction)

Если значение для указанного ключа присутствует и не равно нулю, выполняется попытка вычислить новое сопоставление с учетом ключа и его текущего сопоставленного значения.

4

по умолчанию void forEach (действие BiConsumer <? super K,? super V>)

Выполняет данное действие для каждой записи в этой карте, пока все записи не будут обработаны или действие не вызовет исключение.

5

V getOrDefault по умолчанию (ключ объекта, V defaultValue)

Возвращает значение, которому сопоставлен указанный ключ, или defaultValue, если эта карта не содержит сопоставления для ключа.

6

V-слияние по умолчанию (ключ K, значение V, BiFunction <? super V,? super V, extends V> remappingFunction)

Если указанный ключ еще не связан со значением или связан с нулем, связывает его с заданным ненулевым значением.

7

V putIfAbsent (ключ K, значение V)

Если указанный ключ еще не связан со значением, свяжите его с данным значением.

8

логическое удаление (ключ объекта, значение объекта)

Удаляет запись для ключа только в том случае, если в данный момент сопоставлено заданному значению.

9

Заменить V (ключ K, значение V)

Заменяет запись для ключа только в том случае, если в данный момент сопоставлено с некоторым значением.

10

логическая замена (клавиша K, V oldValue, V newValue)

Заменяет запись для ключа только в том случае, если в данный момент отображается на заданное значение.

11

по умолчанию void replaceAll (BiFunction <? super K,? super V, extends V> function)

Заменяет значение каждой записи на результат вызова данной функции для этой записи, пока все записи не будут обработаны или функция не выдаст исключение.

V вычисление по умолчанию (клавиша K, BiFunction <? super K?? super V? расширяет V> remappingFunction)

Пытается вычислить сопоставление для указанного ключа и его текущего сопоставленного значения (или ноль, если текущего сопоставления нет).

по умолчанию V computeIfAbsent (клавиша K, функция <? super K, extends V> mappingFunction)

Если указанный ключ еще не связан со значением (или сопоставлен со значением NULL), он пытается вычислить его значение с использованием заданной функции сопоставления и вводит его в эту карту, если не имеет значение NULL.

по умолчанию V computeIfPresent (клавиша K, BiFunction <? super K,? super V, расширяет V> remappingFunction)

Если значение для указанного ключа присутствует и не равно нулю, выполняется попытка вычислить новое сопоставление с учетом ключа и его текущего сопоставленного значения.

по умолчанию void forEach (действие BiConsumer <? super K,? super V>)

Выполняет данное действие для каждой записи в этой карте, пока все записи не будут обработаны или действие не вызовет исключение.

V getOrDefault по умолчанию (ключ объекта, V defaultValue)

Возвращает значение, которому сопоставлен указанный ключ, или defaultValue, если эта карта не содержит сопоставления для ключа.

V-слияние по умолчанию (ключ K, значение V, BiFunction <? super V,? super V, extends V> remappingFunction)

Если указанный ключ еще не связан со значением или связан с нулем, связывает его с заданным ненулевым значением.

V putIfAbsent (ключ K, значение V)

Если указанный ключ еще не связан со значением, свяжите его с данным значением.

логическое удаление (ключ объекта, значение объекта)

Удаляет запись для ключа только в том случае, если в данный момент сопоставлено заданному значению.

Заменить V (ключ K, значение V)

Заменяет запись для ключа только в том случае, если в данный момент сопоставлено с некоторым значением.

логическая замена (клавиша K, V oldValue, V newValue)

Заменяет запись для ключа только в том случае, если в данный момент отображается на заданное значение.

по умолчанию void replaceAll (BiFunction <? super K,? super V, extends V> function)

Заменяет значение каждой записи на результат вызова данной функции для этой записи, пока все записи не будут обработаны или функция не выдаст исключение.

пример

Следующая программа TestThread показывает использование ConcurrentMap против HashMap.

Live Demo

import java.util.ConcurrentModificationException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class TestThread {

   public static void main(final String[] arguments) {
      Map<String,String> map = new ConcurrentHashMap<String, String>();

      map.put("1", "One");
      map.put("2", "Two");
      map.put("3", "Three");
      map.put("5", "Five");
      map.put("6", "Six");

      System.out.println("Initial ConcurrentHashMap: " + map);
      Iterator<String> iterator = map.keySet().iterator();

      try { 
         
         while(iterator.hasNext()) {
            String key = iterator.next();
            
            if(key.equals("3")) {
               map.put("4", "Four");
            }
         }
      } catch(ConcurrentModificationException cme) {
         cme.printStackTrace();
      }
      System.out.println("ConcurrentHashMap after modification: " + map);

      map = new HashMap<String, String>();

      map.put("1", "One");
      map.put("2", "Two");
      map.put("3", "Three");
      map.put("5", "Five");
      map.put("6", "Six");

      System.out.println("Initial HashMap: " + map);
      iterator = map.keySet().iterator();

      try {
         
         while(iterator.hasNext()) {
            String key = iterator.next();
            
            if(key.equals("3")) {
               map.put("4", "Four");
            }
         }
         System.out.println("HashMap after modification: " + map);
      } catch(ConcurrentModificationException cme) {
         cme.printStackTrace();
      }
   }  
}

Это даст следующий результат.