ConcurrentModificationException

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
ich verwende untere Methode um Objekte zu kopieren, diese Methode unten wird so von verschiedenen Stellen aufgerufen,
kann sich jemand erklären, warum ich diese Exceprion unten bekomme?

Vielen Dank,

Code:
new Thread() {
            public void run() {
                try {
                    createNewChartObject();  // in dieser Methode wird deepCopy aufgerufen
                    ChartUtilities.saveChartAsJPEG(file, copiedChartObject.getChart(), copiedChartObject.getWidth(), copiedChartObject.getHeight());
                    } 
                catch (IOException ex) {
                    ex.printStackTrace();
                    }
                }
            }.start();


Code:
private Object deepCopy(Object o) {  
        ByteArrayOutputStream baos = null;    
        ByteArrayInputStream bais = null;
        ObjectOutputStream ops = null;
        try {
            baos = new ByteArrayOutputStream();
            ops = new ObjectOutputStream( baos );
            ops.writeObject(o);                                      // hier bekomme ich eine Exception in thread "Thread-5" java.util.ConcurrentModificationException

            baos.flush();
            bais = new ByteArrayInputStream( baos.toByteArray() );            
            return new ObjectInputStream(bais).readObject();
            }
        catch (IOException e) {
            e.printStackTrace();
            }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
            }
        finally {           
            try {
                if(bais != null)
                    bais.close();
                if(baos != null)
                    baos.close();
                if (ops != null)
                    ops.close();
                } 
            catch (IOException ex) {
                ex.printStackTrace();
                }
            }
        return null;
        }


Exception:
Code:
[/coException in thread "Thread-5" java.util.ConcurrentModificationException
        at java.util.ArrayList.writeObject(ArrayList.java:573)
        at sun.reflect.GeneratedMethodAccessor15.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
de]
 
S

SlaterB

Gast
was ist denn o für ein Objekt?
baue in dein Programm Logging ein a la

XY verwendet nun Objekt x
XY fertig mit Objekt x
YZ verwendet nun Objekt x

wenn da zweimal verwendet ohne fertig dahinter steht, dann kann das wohl passieren,
synchronisiere evtl. den Zugriff auf dieses gemeinsame Objekt x
 
G

Guest

Gast
ich bin mal davon ausgegangen, dass, wenn ich private Object deepCopy(Object o) -> synchronized mache, diese Exception nicht mehr auftritt aber leider ist das Gegenteil der Fall,

wie kann das sein, meines wissens kann ja kein zweiter Thread die Methode private Object deepCopy(Object o) betreten, wenn ich diese Methode synchronize, also kann auch keine ConcurrentModificationException auftreten, da das Objekt nur einmal verarbeitet wird,

Mir ist überhaupt nicht klar warum diese Exception auftritt, ich rufe die Methode private Object deepCopy(Object o) alle 40s mal auf, das Serealisieren kann ja nicht so lange dauern,

nützt es vielleicht was wenn alle anderen Threads ausser den main- Thread stoppe??
 
S

SlaterB

Gast
das Problem liegt beim Objekt, irgendjemand anders verändert es, während deepCopy es serialisiert,
diese Operation synchronized zu machen bringt gar nix, andere Threads können genauso noch auf das Objekt zugreifen
(vielleicht ist nicht das Objekt selber sondern ein referenziertes Objekt das Problem, irgendeine Java-Collection)

soweit natürlich nur die Theorie, vielleicht gibts noch ganz andere Gründe,
alle anderen Threads zu stoppen wäre eine gute Idee, selbst nur testweise um zu sehen ob es einen Unterschied macht,

du solltest weiterhin genau prüfen, was diese Thread parallel machen, welche Objekte sie vielleicht bearbeiten,

ein andere Vorgehensweise ist, noch das fragliche Objekt x zu speichern sondern ein einfaches Dummy-Objekt und dieses Schritt für Schrit um enthaltene Attribute zu erweitern, bis du das Originalobjekt erreichst,
so erkennst du vielleicht, welcher Teil des Objektes das Problem ist,

setzt natürlich alles voraus, dass die Exception regelmäßig auftritt,
bei dieser Art Fehler normalerweise eher schwierig..
 
G

Guest

Gast
wenn ich es ohne Thread mache, dann funktionierts, einziger nachteil halt, dass das Popup- Fenster unschön lange sichtbar bleibt und die Fenster eben stagnieren für eine gewisse Zeit, sehr unschön aber es funktioniert wenigstens ohne Exception,

lg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ConcurrentModificationException Allgemeine Java-Themen 2
D java.util.ConcurrentModificationException tritt auf Allgemeine Java-Themen 12
F ConcurrentModificationException warum ? Allgemeine Java-Themen 7
K Collections java.util.ConcurrentModificationException Allgemeine Java-Themen 3
N ConcurrentModificationException Allgemeine Java-Themen 2
S java.util.ConcurrentModificationException - aber nur ein Thread Allgemeine Java-Themen 3
D java.util.ConcurrentModificationException - per Copy vermeiden Allgemeine Java-Themen 11
D java.util.ConcurrentModificationException bei ArrayList Allgemeine Java-Themen 2
F ConcurrentModificationException Allgemeine Java-Themen 2
P Vectoren bearbeiten: ConcurrentModificationException Allgemeine Java-Themen 4
B ConcurrentModificationException Allgemeine Java-Themen 3
G ConcurrentModificationException - finds nicht Allgemeine Java-Themen 5
S Fehler ConcurrentModificationException Allgemeine Java-Themen 8
R java.util.ConcurrentModificationException vermeiden? Allgemeine Java-Themen 8
R ConcurrentModificationException Allgemeine Java-Themen 9
D ConcurrentModificationException nicht nachvollziehbar Allgemeine Java-Themen 8
K Threading - schreiben auf Hashmap/löschen - ConcurrentModificationException Allgemeine Java-Themen 3
J java.util.ConcurrentModificationException bei HashMap? Allgemeine Java-Themen 2
E ConcurrentModificationException Allgemeine Java-Themen 6
R ConcurrentModificationException trotz synchronized? Allgemeine Java-Themen 12
P java.util.ConcurrentModificationException Allgemeine Java-Themen 9
M ConcurrentModificationException Allgemeine Java-Themen 6
S ConcurrentModificationException Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben