Я пытаюсь найти ответ на них, но не могу понять (или подтвердить) его в Google или в документах Java.
Моя реализация выглядит следующим образом:
Map<String, POJO> map = new ConcurrentHashMap<String, POJO>();
если я сделаю
value1 = map.get(key1);
value1.setProp(prop);
Любой другой поток может переопределить.
Теперь, я думаю, если я буду делать следующее: это будет атомная операция /, другими словами, она заблокирует сегмент key1?
map.compute(key1, (key1, value1) -> { value1.setProp(prop) });
Javadoc для compute
функции
Попытка вычислить сопоставление для указанного ключа и его текущего отображаемого значения (или null, если нет текущего сопоставления). Весь вызов метода выполняется атомарно. Некоторые попытки выполнить операции обновления на этой карте другими потоками могут быть заблокированы, пока выполняется вычисление, поэтому вычисление должно быть коротким и простым и не должно пытаться обновлять любые другие сопоставления этой Карты.
Рекомендации:
1. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html 2. https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html#compute-K-java.util.function.BiFunction-
РЕДАКТИРОВАТЬ:
для моей окончательной реализации я сделал что-то вроде этого, поскольку все потоки разделяют NewMap и в конце, я новый список POJO
Абстрактный тип данных
public class NewMap {
private Map<String, POJO> map;
private boolean isUpdatable;
void NewMap(){
isUpdatable = true;
map = new ConcurrentHashMap();
}
void putPOJOProp1(String key, Type value) throws ReadOnlyException{
map.compute(key, (k,v) -> {
if(!isUpdatable) throw new ReadOnlyException();
if(k == null){
POJO p = new POJO();
p.setProp1(value);
v = p;
} else {
v = v.setProp1(v)
}
});
}
void putPOJOProp2....
void putPOJOProp3....
List<POJO> getAll() {
isUpdatable = false;
List<POJO> pojos;
for(key: map.getKeys()) {
Pojo p = map.get(key);
p.setKey(key);
pojos.add(p);
}
return pojos;
}
}