Я пытаюсь заполнить кеш, который содержит ключ/значение, с помощью ConcurrentHashMap.
Я предполагаю, что использование 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 .
ConcurrentHashMap
напрямую? То, как вы написали свой код, на самом деле устраняет преимущество использованияputIfAbsent
, которое делает то же самое, что и вашif
, но безопасным для потоков способом. - person mikołak   schedule 04.09.2013