Il metodo forEach di ConcurrentHashMap è thread-safe? [duplicare]
Se vuoi iterare su tutti gli elementi in ConcurrentHashMap, stai usando il forEach
metodo thread-safe?
Risposte
Dipende da cosa intendi per thread-safe.
- Se sei d'accordo con altri thread che possono modificare la mappa mentre sei nel mezzo di una
forEach
chiamata, allora sì, è thread-safe. - Se si desidera che la mappa non sia modificabile mentre
forEach
è in corso in modo tale che altri thread vengano bloccati o si verifichino errori se tentano di modificarla, no, non lo è.
La documentazione API dice:
Tuttavia, anche se tutte le operazioni sono thread-safe, le operazioni di recupero non comportano il blocco e non esiste alcun supporto per il blocco dell'intera tabella in modo tale da impedire qualsiasi accesso.
...
Allo stesso modo, iteratori, divisori ed enumerazioni restituiscono elementi che riflettono lo stato della tabella hash a un certo punto o dopo la creazione dell'iteratore / enumerazione. Non lanciano
ConcurrentModificationException
.... Tieni presente che i risultati dei metodi di stato aggregato ... sono tipicamente utili solo quando una mappa non sta subendo aggiornamenti simultanei in altri thread. In caso contrario, i risultati di questi metodi riflettono stati transitori che possono essere adeguati per scopi di monitoraggio o stima, ma non per il controllo del programma.