Я хочу реализовать безопасную по потоку карту очередей.Thread safe Карта очередей
Я намерен начать с пустой карты. Если ключ не существует, я хочу создать новую запись в карте с новой очередью. Если ключ существует, я хочу добавить его в очередь. Предлагаемый мною реализация выглядит следующим образом:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
public class StackOverFlowExample {
private final Map<String, ConcurrentLinkedQueue<String>> map = new ConcurrentHashMap<>();
public void addElementToQueue(String key, String value){
if (map.containsKey(key)){
map.get(key).add(value);
}
else{
ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.add(value);
map.put(key, queue);
}
}
}
Меня беспокоит то, что, когда несколько потоков пытаются добавить новое значение в карту, то первым будет поставить новую запись карты с новой очередью, то второй будет ждать, а затем добавьте новую очередь для ключа, а не добавьте в очередь. Знания API параллелизма/параллелизма в лучшем случае невелики. Возможно, параллелизм на месте, чтобы избежать этого? Совет будет высоко оценен.
Что бы иметь смысл, если ConcurrentHashMap используется блокировка при извлечении. Это не так. – spudone
Ah right, ConcurrentHashMap «просто» использует структуры данных, которые устойчивы к множественному считыванию. Блокировка используется только писателями за короткий промежуток времени, необходимый для добавления или удаления элемента с карты. Я продолжаю забывать эту деталь реализации, потому что это действительно не имеет значения с программной точки зрения. Проблема все еще возникает в одном месте (одновременное «существует ли X в hashmap?» Одновременно с «созданием нового хэшмапа»), и решение одно и то же - синхронизировать метод addElementToQueue. –
Используя синхронизированный блок, ему действительно не нужны параллельные структуры данных, если в коде больше нет. – spudone