Невозможно добавить элементы в параллельный HashMap. Почему? - PullRequest
0 голосов
/ 19 сентября 2018

Написал следующий тестовый код для моего понимания на Concurrent HashMap

Моя проблема в том, что код не работает должным образом, и я думаю, что он заканчивается бесконечным циклом, где JVM не завершается.

public class Test {
    public static void main(String[] args) {
        Map<Long, Long> map = new ConcurrentHashMap<>();
        map.put(0L, 0L);
        map.put((1L << 32) + 1, 0L); 
        for (long key : map.keySet()) {
            map.put(key, map.remove(key));
        }
    }
}

Я не уверен, почему это происходит, может кто-нибудь помочь мне понять это поведение.

1 Ответ

0 голосов
/ 19 сентября 2018

Я не совсем уверен, что именно вы намеревались сделать, но вы правы, считая, что ваш код застрял в бесконечном цикле.Строка ниже - это то, что создает бесконечный цикл:

map.put(key, map.remove(key)); 

Документация по одновременной хэш-карте для состояний метода remove:

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

Таким образом, ваш код просто перебирает карту, обновляя каждую запись своим текущим значением.Если бы на карте была только 1 запись, она бы вышла из цикла for.

...