Il metodo forEach di ConcurrentHashMap è thread-safe? [duplicare]

Jan 05 2021

Se vuoi iterare su tutti gli elementi in ConcurrentHashMap, stai usando il forEachmetodo thread-safe?

Risposte

1 JohnKugelman Jan 05 2021 at 11:08

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 forEachchiamata, 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.