synchronisations-Problem mit einem Listener

alfi82

Mitglied
Hallo,

Habe ein synchronisations-Problem mit einem EventListener. Ich habe mal den ganzen Code aus dem Handler entfernt und ein paar Testzeilen hinzugefügt mit Wartezeiten etc.

Button wird gedrückt => Listener add

Count=0;
statusConnector.addItemChangeListener(new MyItemChangeAdapter() {
public synchronized void onMyItemChange(final MyItemChangeEvent e) {

if ((e.item == null) {
return;
}
try {
count++;
System.out.print("Start ");
System.out.print("1-"+count+", ");
Thread.sleep(100);
System.out.print("2-"+count+", ");
Thread.sleep(10);
System.out.print("3-"+count+", ");
Thread.sleep(10);
System.out.println("Stop");

} catch (Exception e) {
}
}
});

Button wird losgelassen => Listener remove


Als Ausgabe hätte ich mir folgendes erwartet:

Button drücken:
Start 1-1, 2-1, 3-1, Stop
Start 1-2, 2-2, 3-2, Stop

Button loslassen:
Start 1-1, 2-1, 3-1, Stop
Start 1-2, 2-2, 3-2, Stop


usw…

Aber: Das Event löse ich wie oben angedeutet mit einem Button aus, schlussendlich ist das dann eine Variable, aber dass ist denke ich, nicht so wichtig. Jedenfalls wenn ich den Button wiederholt langsam betätige dann bekomme ich folgendes, was auch stimmt

Start 1-1, 2-1, 3-1, Stop
Start 1-2, 2-2, 3-2, Stop
Start 1-1, 2-1, 3-1, Stop
Start 1-2, 2-2, 3-2, Stop
Start 1-1, 2-1, 3-1, Stop
Start 1-2, 2-2, 3-2, Stop

Aber wenn ich sehr schnell wieder holt drücke dann bekomme ich folgendes

Start 1-2, Start 1-1, 2-2, 3-2, 2-1, Stop
3-1, Stop
Start 1-2, Start 1-1, 2-2, 3-2, 2-1, Stop
Start 1-3, 3-1, Stop
2-3, 3-3, Stop
Start 1-2, 2-2, 3-2, Stop
Start 1-3, 2-3, 3-3, Stop

usw…

Verstehe nicht wie es zu so einer Zeile kommen kann:

Start 1-2, Start 1-1, 2-2, 3-2, 2-1, Stop

wenn ich ja synchronized verwende oder habe ich da was falsch verstanden?



Danke schon mal
 
ich kann den code hier leider nicht testen aber gib der variable count (bitte kleinschreiben) mal die eigenschaft "volatile" mit. also so:

private volatile count = 0;
 
Zurück