Apakah metode forEach ConcurrentHashMap aman untuk thread? [duplikat]
Jika ingin mengulang semua elemen di ConcurrentHashMap, apakah menggunakan forEach
metode thread-safe?
Jawaban
Tergantung apa yang Anda maksud dengan thread-safe.
- Jika Anda
forEach
setuju dengan utas lain yang dapat memodifikasi peta saat Anda sedang menelepon, maka ya, ini aman untuk utas. - Jika Anda ingin peta tidak dapat dimodifikasi saat
forEach
sedang berlangsung sehingga utas lain diblokir atau muncul kesalahan jika mereka mencoba untuk mengubahnya, maka tidak, tidak.
The dokumentasi API mengatakan:
Namun, meskipun semua operasi aman untuk thread, operasi pengambilan tidak memerlukan penguncian, dan tidak ada dukungan untuk mengunci seluruh tabel dengan cara yang mencegah semua akses.
...
Demikian pula, Iterator, Pemisah, dan Pencacahan mengembalikan elemen yang mencerminkan status tabel hash di beberapa titik atau sejak pembuatan iterator / enumerasi. Mereka tidak melempar
ConcurrentModificationException
.... Ingatlah bahwa hasil metode status agregat ... biasanya berguna hanya jika peta tidak mengalami pembaruan bersamaan di utas lain. Jika tidak, hasil dari metode ini mencerminkan status sementara yang mungkin memadai untuk tujuan pemantauan atau estimasi, tetapi tidak untuk pengendalian program.