elementos Atualizando atomicamente recuperar de Mapa usando fluxos 8 paralelas Java

SS':

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.

Bohemian:

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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=185706&siteId=1
Recomendado
Clasificación