2010-11-27 12 views
6

Gözlemcilerim her geçişinde bu hatayı alıyorum.GWT uygulaması, MVC deseninden java.util.ConcurrentModificationException öğesinin alınması

@Override 
public void notifyObservers(ModelViewInterface model) { 
    for(Observer<ModelViewInterface> o : this.observers) 
     o.notify(model); 
} 

GWT'de iplik yok, bu nedenle bir senkronizasyon sorunu değil.

Bir düğmeye bastıktan sonra, bu hatanın nasıl önleneceğine dair herhangi bir fikir ortaya çıkıyor mu? ConcurrentModificationException ait javadoc itibaren

cevap

10

:

Not bu istisna her zaman bir nesne aynı anda bir farklı parçacığı tarafından modifiye edildiğini göstermektedir gelmez. Tek bir iş parçacığı, bir nesnenin sözleşmesini ihlal eden bir dizi yöntem çağrısı yayınlarsa, nesne bu özel durumu atabilir. Örneğin, bir iş parçacığı bir koleksiyonu doğrudan bir başarısız hızlı yineleyici ile yineleme sırasında değiştirirse, yineleyici bu özel durumu atar.

Yani sizin durumda, öyle görünüyor o.notify(model) tuşelere this.observers o - doğrudan veya dolaylı. Bu, üzerinde yinelediğiniz koleksiyonu değiştirirken yaygın bir durumdur.

eşzamanlı değişiklik önlemek için, böyle koleksiyonun bir kopyasını çalışabilir:

for(Observer<ModelViewInterface> o : 
      new ArrayList<ModelViewInterface>(this.observers)) { 

    o.notify(model); 
} 

Ancak bazen istediğin bu değil - o.notify mevcut davranışı aynı zamanda bir hata gösterebilir.

+0

Bu sorunu çözdünüz, teşekkürler. – jax