logo

Java'da ConcurrentModificationException

ConcurrentModificationException, izin verilmeyen bir nesnenin aynı anda değiştirilmeye çalışılması durumunda ortaya çıkar. Bu istisna genellikle biri ile çalışırken ortaya çıkar Java Koleksiyonu sınıfları .

Örneğin - Bir iş parçacığının, başka bir iş parçacığı üzerinde yineleme yaparken bir Koleksiyonu değiştirmesine izin verilmez. Bunun nedeni yinelemenin sonucunun onunla birlikte tanımsız hale gelmesidir. Iterator sınıfının bazı uygulamaları, JRE tarafından sağlanan Iterator'ın genel amaçlı uygulamaları da dahil olmak üzere bu istisnayı ortadan kaldırır. Bunu yapan yineleyicilere denir hızlı başarısız Çünkü koleksiyonun gelecekte herhangi bir zamanda belirsiz davranışlarıyla karşılaşmak yerine böyle bir durumla karşılaştıklarında hızlı bir şekilde istisnayı atıyorlar.

java concat dizeleri

Not:Bu istisnanın yalnızca başka bir iş parçacığının bir Koleksiyon nesnesini değiştirmeye çalıştığında oluşması zorunlu değildir. Bu durum, tek bir iş parçacığının nesnenin sözleşmesini ihlal etmeye çalışan bazı yöntemlerin çağrılması durumunda da meydana gelebilir. Bu, bir iş parçacığının bazı kişiler tarafından yinelenirken Koleksiyon nesnesini değiştirmeye çalıştığında meydana gelebilir.başarısız hızlı yineleyiciyineleyici istisnayı atacaktır.

Örnek

 import java.awt.List; import java.util.*; public class Concurrentmodificationexception { public static void main(String[] args) { ArrayList list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); list.add(5); Iterator it = list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('List Value:' + value); if (value.equals(3)) list.remove(value); } } } 

Çıktı:

Java'da ConcurrentModificationException

Bu mesaj, yineleyicinin listeyi yinelemesi ve bizim aynı anda listede değişiklikler yapmamız nedeniyle bir sonraki yöntem çağrıldığında istisnanın atıldığını söylüyor. Ancak hashmap'te aşağıdaki gibi değişiklikler yaparsak, hashmap'in boyutu değişmeyeceği gibi herhangi bir istisna atmaz.

Örneğin-

 import java.awt.List; import java.util.*; public class concurrentmodificationexception { public static void main(String[] args) { HashMap map = new HashMap(); map.put(1, 1); map.put(2, 2); map.put(3,3); Iterator it = map.keySet().iterator(); while(it.hasNext()) { Integer key = it.next(); System.out.println('Map Value:' + map.get(key)); if (key.equals(2)) { map.put(1, 4); } } } } 

Çıktı:

kat timpf ağırlığı ne kadar
 Map Value:1 Map Value:2 Map Value:3 

Bu örnek tamamen düzgün çalışıyor, çünkü yineleyici harita üzerinde yinelenirken haritanın boyutu değişmiyor. Yalnızca harita güncelleniyor if ifadesi .

ConcurrentModificationException Oluşturucuları

ConcurrentModificationException'ın 4 tür yapıcısı vardır -

Intellij Idea vs Eclipse
  1. genel ConcurrentModificationException() -
    Bu, hiçbir parametre içermeyen bir ConcurrentModificationException oluşturur.
  2. public ConcurrentModificationException(Dize mesajı)
    Bu, İstisnayı belirten ayrıntılı bir mesaj içeren bir ConcurrentModificationException oluşturur.
  3. public ConcurrentModificationException(Atılabilir neden)
    Bu, bir nedeni ve (cause==null?null:cause.toString()) mesajını içeren bir ConcurrentModificationException oluşturur. Nedeni daha sonra Throwable.getCause() tarafından alınır.
  4. public ConcurrentModificationException(Dize mesajı, Atılabilir neden)
    Bu, ayrıntılı bir mesaj ve bir neden içeren bir ConcurrentModificationException oluşturur. (cause==null?null:cause.toString()). Mesaj daha sonra Throwable.getMessage() tarafından alınır ve nedeni daha sonra Throwable.getCause() tarafından alınır.

Çok iş parçacıklı bir ortamda ConcurrentModificationException nasıl önlenir?

Çok iş parçacıklı bir ortamda ConcurrentModificationException'dan kaçınmak için aşağıdaki yolları takip edebiliriz:

  1. Koleksiyon sınıfı üzerinde yineleme yapmak yerine dizi üzerinde yineleme yapabiliriz. Bu sayede küçük boyutlu listelerle çok iyi çalışabiliriz ancak dizi boyutu çok büyükse bu durum performansı tüketecektir.
  2. Başka bir yol da listeyi senkronize bloğa koyarak kilitlemek olabilir. Çoklu iş parçacığı kullanmanın tek amacından feragat edildiği için bu etkili bir yaklaşım değildir.
  3. JDK 1.5 veya üzeri, ConcurrentHashMap ve CopyOnWriteArrayList sınıflarını sağlar. Bu sınıflar eşzamanlı değişiklik istisnasından kaçınmamıza yardımcı olur.

Tek iş parçacıklı bir ortamda ConcurrentModificationException nasıl önlenir?

Yineleyicinin kaldır() işlevini kullanarak, bir nesneyi temeldeki koleksiyon nesnesinden kaldırabilirsiniz.