Apakah metode forEach ConcurrentHashMap aman untuk thread? [duplikat]

Jan 05 2021

Jika ingin mengulang semua elemen di ConcurrentHashMap, apakah menggunakan forEachmetode thread-safe?

Jawaban

1 JohnKugelman Jan 05 2021 at 11:08

Tergantung apa yang Anda maksud dengan thread-safe.

  • Jika Anda forEachsetuju 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 forEachsedang 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.