У меня есть 4 потока - 2 потока обновляются, а 2 потока читаются на concurrentHashMap. Код выглядит следующим образом:
private static ConcurrentHashMap<String, String> myHashMap = new ConcurrentHashMap<>();
private static final Object lock = new Object();
Метод запуска потока 1 и потока 2 (ключ и значение представляют собой строку)
synchronized (lock) {
if (!myHashMap.containsKey(key)) {
myHashMap.put(key, value);
} else {
String value = myHashMap.get(key)
// do something with the value
myHashMap.put(key, value);
}
}
Метод запуска Thread 3 и Thread 4 выполняет печать
for (Entry<String, String> entry : myHashMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key, " + key + " value " + value);
}
Есть ли проблема с приведенным выше использованием кода ConcurrenHashMap? Потому что, когда я читал Javadoc и искал в Интернете, я нашел следующее утверждение:
- Этот класс полностью совместим с Hashtable в программах, которые полагаются на его потокобезопасность, но не на детали синхронизации. (Примечание. Я понимаю, что результат потока печати может быть не самым последним результатом, но это нормально. пока поток обновления делает все правильно.)
- Существует также некоторая претензия к веб-сайту, в которой говорится, что один и тот же итератор нельзя использовать для двух или более разных потоков. Поэтому мне интересно, использует ли метод печати тот же итератор в двух потоках выше. И почему мы не можем использовать один и тот же итератор в двух разных потоках?
Что касается требования, я хочу одновременное чтение без блокировки, поэтому я выбираю ConcurrentHashMap.
merge()
. - person shmosel   schedule 17.07.2018compute
илиmerge
, не зная, что на самом деле делает что-то со значением. - person Radiodef   schedule 17.07.2018