Запись в одну переменную из разных потоков с подвохом
У меня есть статический 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");
}
}
}