# java.util.ConcurrentModificationException



## PollerJava (15. Okt 2007)

Hallo,

ich bekomme folgende Fehlermeldung:
java.util.ConcurrentModificationException

bei folgendem Code unten,
Die Methode unten kann von mehreren Threads aufgerufen werden, kann ich das durchlaufen írgendwie synchronisieren, sodass die Fehlermeldung nicht mehr auftritt.
Ich hab schon die ganze Methode synchronized aber das hat das Problem nicht behoben.

Vielen Dank,

lg




```
private XYDataset createDataset(final String name, RegularTimePeriod start, List<DBWertReadBean> dBWerte, final int trendCnt, final int xSeite)                               
        {
            series[xSeite][trendCnt] = null;
            series[xSeite][trendCnt] = new TimeSeries(name, start.getClass());          
            for(DBWertReadBean liste : dBWerte)           // hier tritt die Fehlermeldung auf                    
            {          
            DateTime dateTime = new DateTime(); 
            dateTime.setDateTime(liste.getZeitstempel().toString());        
                Second sec = new Second(dateTime.getSecond(), dateTime.getMinute(), dateTime.getHour(), 
dateTime.getDay(), dateTime.getMonth(), dateTime.getYear());
                series[xSeite][trendCnt].add(sec, liste.getWert());     
                dateTime = null;
                sec = null;            
            }  
        dataset = new TimeSeriesCollection();   
        dataset.addSeries(series[xSeite][trendCnt]); 
        return dataset;
        }
```


----------



## y0dA (15. Okt 2007)

Du solltest einfach eine deep copy des zuiterierenden Objektes anlegen, welches du anscheinend in der for Schleife änderst.


----------



## maki (15. Okt 2007)

dBWerte wird anscheinend nebenläufig verändert.

Brauchst du mehrere Threads?


----------



## byte (15. Okt 2007)

Diese Exception fliegt, wenn Du die Liste dbWerte veränderst, während Du durch sie iterierst. Das ist aber aus dem geposteten Code nicht ersichtlich. Wenn Du mit mehreren Threads arbeitest, könnte es sein, dass ein anderer Thread während des Iterierens ein Element hinzufügt oder entfernt?


----------



## PollerJava (15. Okt 2007)

Naja, ich hole mir in einer anderen Klasse die Werte aus der DB, dann wird die Methode update aufgerufen (in dieser werden die Achsen gezeichnet), dann wird die Methode createPlot aufgerufen und in der wird eben createDataset aufgerufen,

D.h. also, wenn in der Methode createDataset dBWerte durchlaufen wird und z.B.: in der Methode updatePanel etwas an dBWerte verändert wird, dann bekomme ich diese Fehlermeldung??

vielen Dank


```
// in der Methode, in der die Daten aus der DB geholt werden wird diese Methode unten aufgerufen
    werteList = sqlMap.queryForList("getWerte", wb);
1. multipleAxisTrend.updatePanel(werteList, name, xSeite, einheit, lineColor, zeitRaum);    

2. public void updatePanel(List<DBWertReadBean> dBWerte, String nameLinie, int xSeite, String einheit, Color lineColor, int zeitRaum)     
       { 
       createPlot(dBWerte, einheit, xSeite, nameLinie, trendCnt[xSeite], lineColor, addAxis, zeitRaum);
       }


3. private void createPlot(List<DBWertReadBean> dBWerte, String einheit, int xSeite, String nameLinie, int trendCnt, Color lineColor, boolean addAxis, int zeitRaum)
        { 
        XYDataset dataset = createDataset(nameLinie, sec1, dBWerte, trendCnt, xSeite); 
        }




4. private XYDataset createDataset(final String name, RegularTimePeriod start, List<DBWertReadBean> dBWerte, final int trendCnt, final int xSeite)                               
        {
            series[xSeite][trendCnt] = null;
            series[xSeite][trendCnt] = new TimeSeries(name, start.getClass());          
            for(DBWertReadBean liste : dBWerte)           // hier tritt die Fehlermeldung auf                    
            {          
            DateTime dateTime = new DateTime(); 
            dateTime.setDateTime(liste.getZeitstempel().toString());        
                Second sec = new Second(dateTime.getSecond(), dateTime.getMinute(), dateTime.getHour(), 
dateTime.getDay(), dateTime.getMonth(), dateTime.getYear());
                series[xSeite][trendCnt].add(sec, liste.getWert());     
                dateTime = null;
                sec = null;            
            }  
        dataset = new TimeSeriesCollection();   
        dataset.addSeries(series[xSeite][trendCnt]); 
        return dataset;
        }
```


----------



## byte (15. Okt 2007)

PollerJava hat gesagt.:
			
		

> D.h. also, wenn in der Methode createDataset dBWerte durchlaufen wird und z.B.: in der Methode updatePanel etwas an dBWerte verändert wird, dann bekomme ich diese Fehlermeldung??


Ja.
Ich würde mir auch dringend mal überlegen, wie Du die Datenstruktur etwas sinnvoller aufbaust. Es kann nur schief gehn, wenn man wild nebenläufig auf einer Datenstruktur arbeitet, ohne sich im Vorhinein Gedanken darüber zu machen, welche Konsequenzen das haben kann.
Also erstmal systematisch Datenmodell aufbauen und dann die schreibenden Zugriffe sinnvoll mit den Lesenden synchronisieren.


----------



## PollerJava (15. Okt 2007)

Da gibts ja irgendsowas wie eine synchronized HashMap auch oder?


----------



## maki (15. Okt 2007)

> Da gibts ja irgendsowas wie eine synchronized HashMap auch oder?


Klar Gibt es auch Threadsichere Collections, aber die eigentliche Frage ist: Brauchst du mehrere Threads?


----------



## PollerJava (15. Okt 2007)

ja auf jeden Fall,
ich habe mehrere JFreeChart- Seiten und die werden z.B.: alle 5sec, 7 sec oder auch verschieden schnell aktualisiert,
und dafür habe ich eben für jede JFreeChart- Seite einen eigenen Thread,

lg


----------



## maki (15. Okt 2007)

Ich kann mich byto nur anschliessen, strukturiere die Anwendung bzw. die Threads, zB: Einer liest Daten aus der DB, solange er nicht fertig ist, kann die Collection von keinem anderen Objekt/Methode/Thread verwendet werden.
Wenn der Thread fertig ist, übergibt er die Collection an andere Objekte/Methoden/Threads, danach darf er sie nicht mehr ändern.


----------

