Можем ли мы использовать 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);
Я думаю, что это не правильно, потому что два потока могут читать ключ один за другим, писать один за другим и в результате получить неправильное значение.
Что вы думаете, ребята?