Я пытаюсь заполнить кеш, который удерживает ключ/значение с помощью ConcurrentHashMap.concurrent hashmap и copyonwritearraylist
Я предполагаю, что использование CopyOnWriteArrayList
позаботится о параллелизме, и у меня есть это как мое значение для моего ключа, но я упускаю что-то в приведенном ниже коде и переопределяет его значения при выполнении нескольких потоков.
if (testMap.get(id) == null) {
CopyOnWriteArrayList<String> copyArr = new CopyOnWriteArrayList<String>();
copyArr.add("Add Value");
testMap().putIfAbsent(id, copyArr);
} else {
testMap.put(id,testMap.get().add("Append Value"));
}
Как защитить код, который создает CopyOnWriteArrayList
из нескольких потоков.
Ниже приведена пересмотренная версия кода в соответствии с приведенными ниже рекомендациями.
CopyOnWriteArrayList<Subscriber> subscriberArr = CacheUtils.getSubscriberMap().get(syncDet.getCardNumber());
if (subscriberArr == null) {
subscriberArr = new CopyOnWriteArrayList<Subscriber>();
CopyOnWriteArrayList<Subscriber> refArr =
cacheUtils.getSubscriberMap().putIfAbsent(syncDet.getCardNumber(), subscriberArr);
if (refArr != null) {
subscriberArr = refArr;
}
}
subscriberArr.add(syncDet.getSubScriber());
На итерируя абонентскую карту я не вижу значение объекта. размер равен 0.
Прочтите первое предложение [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html) - это не волшебная замена , есть улов. Что еще более важно, почему вы не пишете на свой 'ConcurrentHashMap' напрямую? То, как вы написали свой код, фактически удаляет преимущества использования 'putIfAbsent', который делает именно то, что ваш' if', но поточно-безопасным способом. –
Мне нужно проверить, уже ли аррайалист уже существует для этого идентификатора. если он существует, я должен добавить к нему свою ценность. –
Итак, вам нужен мультимап? Хорошо, тогда я попытаюсь написать ответ. –