У меня есть ConcurrentHashMap:
ConcurrentHashMap<ID,Object> map;
В моем приложении эта карта с высоким уровнем чтения и низким уровнем записи
Чтение работает следующим образом:
public Response getObject() {
Response response = createResponse();
Object obj = map.get(ID);
if (obj != null) {
if (obj.getAttribute1() == some_value) {
response.setAttr1(obj.getAttr1());
response.setAttr2(obj.getAttr2());
}
}
return response;
}
Обновление работает следующим образом:
public void updateObject(Object obj, int action) {
if (action == ADD) {
map.put(obj.getID(), obj);
} else if (action == UPDATE) {
object oldObj = map.get(obj.getID());
if (oldObj != null) {
map.put(obj.getID(), obj);
}
} else if (action == REMOVE) {
object oldObj = map.get(obj.getID());
if (oldObj != null) {
map.remove(obj.getID());
}
}
}
Теперь мой вопрос заключается в том, является ли ConcurrentHashMap достаточным для вышеприведенного случая, чтобы работать в многопоточном режиме безопасным для потоков образом, или мне приходится внешне блокировать объект с помощью блокировки ReadWrite или использовать клонирование объекта?
Предположим, что в случае, когда объект obj читается из карты, ConcurrentHashMap удостоверится, что он вернет последний записанный объект, но что делать, когда этот объект удаляется / обновляется потоком записи сразу после чтения. Объект чтения (который уже удален / обновлен) из карты) используется для подготовки объекта ответа, а его атрибут - для принятия определенных решений.
А каким должен быть лучший способ обновить карту?