Можем ли мы использовать Synchronized для каждой записи вместо ConcurrentHashMap?

Это проблема: нам нужна хеш-таблица, записи которой являются поточно-ориентированными.

Предположим, у меня есть хэш-таблица<String, Long>и я хочу увеличить значение одного из потоков записей безопасно: это нормально ?:

HashMap<String , Long> hashTable = new HashMap<String, Long>();

Тогда всякий раз, когда я хочу увеличить запись:

Synchronized (hashTable.get("key"))
{
    Long value = hashTable.get("key");
    value++;
    hashTable.put("key", value);
}

Я думаю, что это лучше, чем ConcurrentHashMap, так как он блокирует только одну запись, в отличие от ConcurrentHashMap, которая использует сегменты, и блокирует группу записей вместе.

Что еще более важно, я не знаю, как безопасно увеличить его, используя COncurrenHashMap. Например, я думаю, что следующий код не является правильным:

 ConcurrentHashMap<String , Long> hashTable = new ConcurrentHashMap<String, Long>();


 Long value = hashTable.get("key");
 value++;
 hashTable.put("key", value);

Я думаю, что это не правильно, потому что два потока могут читать ключ один за другим, писать один за другим и в результате получить неправильное значение.

Что вы думаете, ребята?

Ответы на вопрос(1)

Ваш ответ на вопрос