Запись в одну переменную из разных потоков с подвохом

У меня есть статический HashMap с которым будут работать несколько потоков. В какой-то момент работы потока, они могут обнаружить, что пара ключ n - значение n еще не создано. Тогда может произойти, что оба потока одновременно упадут в следующий иф:

if (map.get("keyN") == null) {
     map.put("keyN", "valueN");
}

И попытаются одновременно положить каждый свое значение, или сначала положит значение первый поток, а затем второй. В итоге сохранится значение второго, но первый поток будет думать что сохранилось его значение. А я хочу сделать так, что-бы как только новая пара ключ/значение добавлена, больше никто ее изменить не может.

Вопрос - может ли это сделать следующий код и/или есть способ получше?

if (map.get("keyN") == null) {
   synchronized(map) {
      if (map.get("keyN") == null) {
         map.put("keyN", "valueN");
      }
    }
}

Ответы (0 шт):