ConcurrentModificationException trotz synchronized?

Status
Nicht offen für weitere Antworten.

Rock Lobster

Bekanntes Mitglied
Servus,

mit "synchronized" stehe ich irgendwie auf Kriegsfuß, es funktioniert nie so, wie ich es will.
Wenn ich die folgenden drei Methoden habe (die alle synchronized sind):

Code:
		public synchronized void addTaskListener(TaskListener l)
		{
			_taskListeners.add(l);
		}
		
		public synchronized void removeTaskListener(TaskListener l)
		{
			_taskListeners.remove(l);
		}
		
		protected synchronized void sendMessage(TaskMessage msg)
		{
			for(TaskListener l : _taskListeners)
				l.eventOccured(msg, this);
		}

Kann es dann trotzdem zu einer ConcurrentModificationException in der sendMessage() geben? Eigentlich nicht, oder? Weil bei mir trat vorhin ein paarmal eine auf (leider nur selten). Aber ich hab keine Ahnung, wie ich es umschreiben müßte, damit es endlich funktioniert ???:L
 
S

SlaterB

Gast
schaue dir die Variable _taskListeners an,
ist diese private oder öffentlich, gar statisch?
greift außer diesen 3 Operationen noch jemand darauf zu, wird sie irgendwo als Rückgabewert rausgegeben?
 
S

SlaterB

Gast
tja, und testen/ nachbauen kannst du es nicht,
schlechte Voraussetzungen ;)

bist du dir zumindest mit der Interpretation der Exception sicher?

baue vielleicht mal

Code:
try {
  for(TaskListener l : _taskListeners) {
      try {
            l.eventOccured(msg, this); 
      }catch (Throwable t) {
        // Ausgabe a
      }
   }
}catch (Throwable t) {
    // Ausgabe b
}

um ganz sicher zu sein, dass es nicht einfach ein Fehler bei der Event-Ausführung ist
 

Rock Lobster

Bekanntes Mitglied
Okay mittlerweile kommt's sehr oft. Sobald ich den Aufruf auf removeListener wegnehme, läuft alles wie geschmiert (logisch).

Hab es so gemacht wie Du es gesagt hast, es fliegt die "äußere" Exception. Hier der Stracktrace:
Code:
java.util.ConcurrentModificationException
	at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
	at java.util.HashMap$KeyIterator.next(Unknown Source)
	at de.*****.task.TaskListener$TaskListenerSender.sendMessage(TaskListener.java:74)
	at de.*****.task.TaskExecutor$TaskThread.run(TaskExecutor.java:106)
 
S

SlaterB

Gast
also mir fällt dazu nix weiter ein,
ich halte Java für narrensicher, irgendwas muss bei dir noch sein ;)

Code:
public class Test
{
    private List<TaskListener> _taskListeners = new ArrayList<TaskListener>();

    public synchronized void addTaskListener(TaskListener l)
    {
        _taskListeners.add(l);
    }

    public synchronized void removeTaskListener(TaskListener l)
    {
        _taskListeners.remove(l);
    }

    protected synchronized void sendMessage(TaskMessage msg)
    {
        for (TaskListener l : _taskListeners)
            l.eventOccured(msg, this);
    }

    public static void main(String[] args)
        throws Exception
    {
        final Test t = new Test();
        for (int i = 0; i < 1000; i++)
        {
            Runnable r = new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            TaskListener l = new TaskListener();
                            t.addTaskListener(l);
                            Thread.sleep((int)(Math.random() * 50));
                            t.sendMessage(new TaskMessage());
                            Thread.sleep((int)(Math.random() * 50));
                            t.removeTaskListener(l);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                };
            new Thread(r).start();
            Thread.sleep((int)(Math.random() * 10));
        }
    }
}


class TaskMessage
{
    static int count;
    int number;

    public TaskMessage()
    {
        this.number = count++;
    }
}


class TaskListener
{
    static int count;
    int number;

    public TaskListener()
    {
        this.number = count++;
    }

    public void eventOccured(TaskMessage msg, Test test)
    {
        System.out.println("Listener " + number + ", verarbeite Message " + msg.number);
    }
}
läuft
 

Marco13

Top Contributor
SlaterB hat gesagt.:
also mir fällt dazu nix weiter ein,
ich halte Java für narrensicher, irgendwas muss bei dir noch sein ;)

(code)
....

läuft

Wie das bei Thread-Problemen so ist: Die Programme funktionieren, außer an Donnerstagen bei Vollmond.

Aber an den Fragesteller: Schau vielleicht mal hier
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#synchronizedSet(java.util.Set)
die synchronisation sollte überall auf das gleiche Objekt erfolgen - bei dir wäre das "this", aber bei einem Zugriff von außen sollte es vielleicht eher die Collection selbst sein
 

Rock Lobster

Bekanntes Mitglied
Hab es mit dem SynchronizedSet versucht, aber auch hier tritt die Exception auf. Das darf doch echt nicht wahr sein!
Ein anderer Versuch war, die Methoden nicht synchronized zu machen, aber dafür synchronized-Blöcke in den Methoden zu verwenden, die alle auf ein eigenes Lock-Objekt synchronizen. Aber auch das ging nicht.

Dauernd hab ich diese verdammten Probleme mit synchronized... aber so falsch kann mein Code doch gar nicht sein...
 

Rock Lobster

Bekanntes Mitglied
Oh mann...
ich weiß an was es liegt ;)

Wenn ein Event auftritt, wird sendMessage() aufgerufen. Diese wiederum ruft eventOccured() auf, und in eventOccured() habe ich in meinem Fall die removeTaskListener() aufgerufen. Also wird letztendlich der TaskListener innerhalb der for-Schleife entfernt, und daß das nicht gut geht, ist eigentlich klar.

Jetzt weiß ich nur nicht, wie ich das am besten lösen soll, aber das ist ja auch wieder 'ne ganz andere Frage... ich werd mir was einfallen lassen ;)
 
S

SlaterB

Gast
verdammt, darauf hätte ich kommen müssen,
die einzig logische Alternative ;)

eine umständlich sichere Möglichkeit:
bei sendMessage() ein Flag setzen,
in remove (und in add?) bei gesetzten Flag nicht die Liste berühren sondern den Listener in einer zweiten Liste vermerken,
am Ende von sendMessage() flag entfernen, nach der zweiten Liste schauen und nochmal remove() für diese Listener aufrufen,

oder etwas einfacher: generell beim remove (udn add?) die zu entfernenden Listener gesondert speichern und nur zu Beginn von sendMessage übernehmen,

wenn aber letztlich sogar sendMessage 2x eineinander aufgerufen wird, dann hilft nur noch ein Flag
und dann ist z.B. das Einfügen + Senden gar nicht möglich, solange die erste sendMessage()-Operation die Liste blockiert,

also wird nie richtig gut ;)
 
S

SlaterB

Gast
oder so ;)
(wobei dann synchronized selber etwas seltsam wirkt, falls es nicht ausschließlich der Abwehr der Exception gilt)
 
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
G ConcurrentModificationException Allgemeine Java-Themen 4
E ConcurrentModificationException Allgemeine Java-Themen 6
P java.util.ConcurrentModificationException Allgemeine Java-Themen 9
M ConcurrentModificationException Allgemeine Java-Themen 6
S ConcurrentModificationException Allgemeine Java-Themen 4
J Erste Schritte Java 8 Tutorials trotz Java 13 Allgemeine Java-Themen 22
T Input/Output Konsole gibt trotz printf keine Umlaute aus Allgemeine Java-Themen 17
V Applet trotz Ausnahme blockiert Allgemeine Java-Themen 0
G Nullpointer trotz vorherigem Nullcheck Allgemeine Java-Themen 2
R Gleiche Objektreferenz trotz clone()? Allgemeine Java-Themen 12
D JSF Primefaces Chatproblem trotz 3.4 Allgemeine Java-Themen 13
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
T SecurityException trotz signierten JAR? Allgemeine Java-Themen 11
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
B Input/Output Datei noch geöffnet trotz Close Allgemeine Java-Themen 4
M Webstart Exception trotz signierten JARs Allgemeine Java-Themen 3
U DLLs werden nicht gefunden trotz Pfad: Allgemeine Java-Themen 4
R java in der konsole nicht gefunden trotz jre,jdk,home und path Allgemeine Java-Themen 4
D Java Heap error trotz anpassungen mit -xmx Allgemeine Java-Themen 4
S Fenster "verschwindet" nicht, trotz setVisible(false); Allgemeine Java-Themen 22
M Radianwert wiederholt sich trotz unterschiedlicher zufälliger Koordinaten Allgemeine Java-Themen 6
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
B Trotz fat_jar NoClassDefFounError Allgemeine Java-Themen 4
H2SO3- Date "18.11.2002 20:02:33" trotz Locale.GERMAN nic Allgemeine Java-Themen 9
T Security-Exception trotz gegebener Rechte? Allgemeine Java-Themen 3
Saxony Blocked GUI trotz Thread(s) Allgemeine Java-Themen 2
G Leere Datei mit PrintWriter trotz flush und close Allgemeine Java-Themen 8
X Softwareverkauf trotz Lizens Allgemeine Java-Themen 5
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
H NullPointerException trotz Abfangen von null? Allgemeine Java-Themen 9
P Trotz setModal, der JDialog ist nicht modal ? Allgemeine Java-Themen 18
A Kein finally ausführen trotz verlassen des try blocks? Allgemeine Java-Themen 14
G JFileChooser öffnet sich nicht im Browser ( trotz Signatur ) Allgemeine Java-Themen 10
R Bild wird trotz allem einfach nicht angezeigt. - AHHHHH!!!!! Allgemeine Java-Themen 30
M Bild wird trotz MediaTracker nicht oder nur halb gezeichnet Allgemeine Java-Themen 2
J Synchronized Probleme Allgemeine Java-Themen 7
D ReentrantLock oder Synchronized ? Allgemeine Java-Themen 3
B Threads synchronized Allgemeine Java-Themen 3
OnDemand Threads und synchronized Allgemeine Java-Themen 9
N Best Practice Semi-Synchronized Zugriff Allgemeine Java-Themen 0
E Verständnisfrage zu synchronized-Blöcken Allgemeine Java-Themen 3
J yield() Aufruf in einer synchronized-Methode Allgemeine Java-Themen 13
A Frage zu Synchronized Allgemeine Java-Themen 5
R Synchronized - auf welchem Objekt Allgemeine Java-Themen 16
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
P synchronized Allgemeine Java-Themen 4
S komplexe synchronized bedingungen Allgemeine Java-Themen 6
G synchronized Allgemeine Java-Themen 7
J Threads und synchronized Allgemeine Java-Themen 18
hdi synchronized & volatile Allgemeine Java-Themen 10
G zwei mal synchronized Allgemeine Java-Themen 5
J synchronized block mit this und wait() Allgemeine Java-Themen 5
M Verständnis "synchronized" Allgemeine Java-Themen 4
T Thread synchronized Allgemeine Java-Themen 5
Kr0e Synchronized Allgemeine Java-Themen 4
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G synchronized-Sclüsselwort: welche Reihenfolge zum Betreten? Allgemeine Java-Themen 6
R synchronized "gegen sich selbst" Allgemeine Java-Themen 5
R Thread-Problem, und synchronized bringt nix Allgemeine Java-Themen 4
J synchronized (bitte beantworten, urgent! danke) Allgemeine Java-Themen 11
H Ein synchronized Block ausreichend? Allgemeine Java-Themen 6
G synchronized Klasse? Allgemeine Java-Themen 6
G synchronized + threads Allgemeine Java-Themen 12
A deadlocks bei synchronized Allgemeine Java-Themen 3
K vector, synchronized und mehrere methoden Allgemeine Java-Themen 3

Ähnliche Java Themen


Oben