Rumah >Java >javaTutorial >Apa yang perlu dilakukan tentang concurrency exception-java.util.ConcurrentModificationException Java?
Java, sebagai bahasa peringkat tinggi, digunakan secara meluas dalam bahasa pengaturcaraan. Dalam pembangunan aplikasi dan rangka kerja Java, kami sering menghadapi masalah konkurensi. Masalah konkurensi bermakna apabila berbilang benang beroperasi pada objek yang sama pada masa yang sama, beberapa keputusan yang tidak dijangka akan berlaku. Salah satu pengecualian biasa ialah pengecualian java.util.ConcurrentModificationException Jadi bagaimana kita menyelesaikan pengecualian ini dengan berkesan semasa proses pembangunan?
Java.util.ConcurrentModificationException ialah pengecualian masa jalan yang akan dilemparkan apabila melintasi koleksi jika utas lain mengubah struktur koleksi semasa proses traversal. Ringkasnya, apabila satu utas menggunakan lelaran kelas Koleksi untuk melintasi koleksi, utas lain mengubah suai koleksi, menyebabkan lelaran berfungsi secara tidak normal dan akhirnya membuang pengecualian. Memandangkan pengecualian ini akan menyebabkan program berjalan secara tidak normal atau malah ranap, menyelesaikan pengecualian ini merupakan masalah mendesak yang perlu kami selesaikan semasa pembangunan.
Maka kita boleh mengambil kaedah berikut untuk menyelesaikan pengecualian java.util.ConcurrentModificationException.
1. Gunakan Iterator untuk melintasi koleksi
Di Java, koleksi (Senarai, Set, Peta) semuanya melaksanakan antara muka Boleh Diulang dan boleh dilalui menggunakan Iterator tanpa menghasilkan pengecualian ini. Kerana apabila menggunakan Iterator untuk melintasi koleksi, terdapat modCount pembolehubah dalam iterator yang merekodkan perubahan dalam struktur koleksi Setelah didapati bahawa nilai modCount iterator tidak konsisten dengan nilai modCount koleksi, pengecualian ConcurrentModificationException. akan dibuang, yang boleh mengelakkan Tambah, padam dan ubah suai koleksi semasa pengumpulan dengan berkesan.
Contoh kod:
List<String> list = new ArrayList<>(); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); //... }
2. Gunakan kaedah Collections.synchronizedList() untuk penyegerakan
Kaedah Collections.synchronizedList() boleh menukar koleksi Senarai menjadi koleksi selamat benang Apabila koleksi Senarai diubah suai secara serentak, Senarai akan ditambahkan. Operasi kunci untuk mengelakkan ConcurrentModificationException, tetapi kerana kaedah ini menggunakan kunci peringkat objek, ia mungkin menjejaskan prestasi.
Contoh kod:
List<String> list = new ArrayList<>(); List<String> synchronizedList = Collections.synchronizedList(list);
3. Gunakan CopyOnWriteArrayList
CopyOnWriteArrayList ialah kelas selamat-benang baru di Java 5. Idea reka bentuknya ialah menggunakan mekanisme penyalinan untuk masa dengan lebih banyak operasi baca dan kurang operasi tulis operasi tulis, tatasusunan baharu disalin untuk pengubahsuaian, dan operasi baca dilakukan dalam tatasusunan lama, yang mengelakkan masalah ketidakkonsistenan data semasa akses serentak oleh berbilang benang.
Kod contoh:
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
Ringkasan:
Dalam pembangunan Java, kita perlu memahami sepenuhnya konsep dan pengetahuan berkaitan concurrency untuk mengelakkan masalah concurrency yang disebabkan oleh persaingan data. Di atas ialah beberapa kaedah untuk menyelesaikan pengecualian java.util.ConcurrentModificationException Kaedah yang berbeza mempunyai senario terpakai yang berbeza dan perlu dipilih mengikut situasi tertentu. Pada masa yang sama, semasa proses pembangunan serentak, anda juga perlu memberi perhatian kepada isu seperti keselamatan benang, penggunaan kunci dan kebuntuan untuk memastikan ketepatan dan kecekapan program.
Atas ialah kandungan terperinci Apa yang perlu dilakukan tentang concurrency exception-java.util.ConcurrentModificationException Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!