объяснения того, для чего нужен параллелизм Java-хеш-карт, получить / установить ключ или значение? - PullRequest
1 голос
/ 20 декабря 2011

Скажем, я храню объект в хэш-карте, у которой в качестве свойства атомарная длина.

Теперь я хочу добавить ключ в hashmap, если он не существует, и обновить значение, если оно существует.

Когда я получу объект с помощью ключа, я увеличу свойство, которое является атомным длинным.

Что мне нужно понять, так это то, что операция является поточно-ориентированной здесь?

Код Psuedo:

HashMap hm = new HashMap

if(hm.containsKey(key1)) {
  MyCounter counter = (MyCounter)hm.get(key1);
  counter.incrementAndGet();  
}
else {
  MyCounter newCounter = new MyCounter();
  newCounter.incrementAndGet();
  hm.put(key1, newCounter);
}

Ответы [ 2 ]

3 голосов
/ 20 декабря 2011

Я бы использовал синхронизированный блок, так как это намного проще.

Map<KeyType, AtomicInteger> map = ...

synchronized(map) {
   AtomicInteger count = map.get(key);
   if (count == null)
       map.put(key, count = new AtomicInteger());
   count.incrementAndGet();
}

Стоимость синхронизированного вряд ли будет достаточной, чтобы стоило усложнить ваше решение.

0 голосов
/ 20 декабря 2011

Ваш код не является потокобезопасным.

В последовательности есть проблема, когда вы проверяете отсутствие / существование и добавление / обновление значения.

Действие для проверки существования значения в HashMap и обновления (или добавления) значения должно быть "охраняемым".

т.е.

synchronized(hm){
  if(hm.contains(key1)){
   //update
  }
  else{
  //add
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...