Имам 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 в програми, които разчитат на неговата безопасност на нишката, но не и на подробностите за синхронизацията. (Забележка – разбирам, че резултатът от нишката за печат може да не е най-новият резултат, но това е добре стига нишката за актуализиране прави нещата правилно.)
- Има също някои твърдения за уебсайта, които казват, че един и същ итератор не може да се използва за 2 или повече различни нишки. Така че се чудя дали методът за печат използва същия итератор в 2 нишка по-горе. И защо не можем да използваме един и същ итератор в 2 различни нишки?
Що се отнася до изискването, искам едновременно четене без блокиране, затова избирам ConcurrentHashMap.
merge()
. - person shmosel   schedule 17.07.2018compute
илиmerge
, без да знаем какво всъщност прави нещо със стойността. - person Radiodef   schedule 17.07.2018