Eu tenho um fluxo paralelo em que eu estou usando um mapa para transformar os elementos.
Map<Long, List<MyItem>> hashmap = foo.getMap();
itemStream.parallel()
.filter(Objects::nonNull)
.forEach(item -> setProperties(hashmap, item));
O método 'setProperties ()' leva o mapa e item, e realiza um get usando o item e, em seguida, define alguns atributos do item.
O que eu quero é que a configuração recebendo / propriedade a ser feito atomicamente. De modo que os dois segmentos não é possível executar um get na mesma tecla e ter atualizações de propriedade ser intercaladas.
private void setProperties(Map<Long, List<Item>> map, Item item) {
long id = item.getID();
List<Object1> items = map.get(id);
for (Object1 ob : items) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
Também um pouco preocupado com o hit latência e se este tipo de paralelização realmente vai ter um benefício vs a abordagem de rosca única existente.
Synchnorising o Mapa ou a obter a partir dele não tem nenhum benefício, porque o mapa não está sendo alterada por isso não há condição de corrida.
Você precisa sincronizar as atualizações assim que elas acontecem todos de uma vez:
for (Object1 ob : items) {
synchronized (ob) {
ob.setId(item.getFloorId());
ob.setPath(item.getPath());
ob.setTypeName(item.getTypeName());
}
}
Isto terá muito pouco impacto no desempenho, porque estes dias sincronizar introduz muito pouca sobrecarga e você só irá bloquear, se o mesmo item está sendo operado.