Rumah > Java > javaTutorial > teks badan

Mengapa Saya Mendapat ConcurrentModificationException Walaupun Menggunakan `synchronized`?

Patricia Arquette
Lepaskan: 2024-11-09 01:56:02
asal
262 orang telah melayarinya

Why Do I Get ConcurrentModificationException Even When Using `synchronized`?

Bagaimanakah Saya Boleh Mendapatkan ConcurrentModificationException Walaupun Menggunakan Synchronized?

Adalah perkara biasa untuk mengandaikan bahawa menggunakan kata kunci yang disegerakkan menghalang semua isu konkurensi. Walau bagaimanapun, ia hanya memastikan bahawa satu utas pada satu masa boleh mengakses blok kod yang disegerakkan. Ia tidak menghalang pengubahsuaian pada koleksi diulangi.

Pertimbangkan kod berikut:

public synchronized X getAnotherX() {
  if (iterator.hasNext()) {
    X b = iterator.next();
    String name = b.getInputFileName();
    ...
    return b;
  } else {
    return null;
  }
}
Salin selepas log masuk

Pengepala pengisytiharan yang disegerakkan hanya memastikan bahawa keseluruhan kaedah dilaksanakan oleh satu urutan pada satu masa. Walau bagaimanapun, ia tidak menghalang koleksi yang diakses oleh lelaran daripada diubah suai oleh urutan lain.

Mengapa ConcurrentModificationException Berlaku?

ConcurrentModificationException biasanya berlaku apabila anda mengubah suai koleksi yang diulang dalam gelung lelaran. Sebagai contoh, kod berikut akan menyebabkan pengecualian ini:

Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    Item item = (Item) iterator.next();
    if (item.satisfiesCondition()) {
        collection.remove(item);
    }
}
Salin selepas log masuk

Dalam kes ini, anda harus menggunakan kaedah iterator.remove() untuk mengalih keluar elemen sebaliknya. Jika anda perlu menambah koleksi, anda tidak boleh bergantung pada kaedah yang disegerakkan. Walau bagaimanapun, jika anda berurusan dengan senarai, anda boleh menggunakan subjenis ListIterator, yang menyediakan kaedah add().

Atas ialah kandungan terperinci Mengapa Saya Mendapat ConcurrentModificationException Walaupun Menggunakan `synchronized`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan