Servus,
kann mir jemand in 2 - 3 Sätzen erklären, was genau das synchronized-Statement eigentlich bewirken soll? Meine bisherige Auffassung war eigentlich immer, daß Code, der sich in einem synchronized-Block befindet, von keinem anderen Thread unterbrochen werden kann und somit am Stück ausgeführt wird, also so, als gäbe es in diesem Moment keine anderen Threads.
Das Problem ist allerdings, daß ich noch nie das Gefühl hatte, daß mir ein synchronized-Block was bringt, denn immer wenn ich einen einsetzen will, um einen Thread-Fehler zu vermeiden, ist die Wirkung gleich null.
Mein konkretes Problem sieht zur Zeit so aus:
- eine Klasse besitzt einen Thread, der hin und wieder über eine Liste von Listenern iteriert, um diese zu benachrichtigen.
- die Klasse besitzt auch eine addListener()-Funktion, die einen Listener in die Liste einträgt.
- je nachdem wie der Mond grad steht passiert beides gleichzeitig, und das ist dann natürlich problematisch, da die Iteration es nicht gerne sieht, wenn da einer einen neuen Listener reinwirft.
Jetzt war meine Idee, die Iterationen einfach in einen synchronized-Block zu setzen, aber das bringt wie gesagt überhaupt nix. Möglicherweise ist eben mein Verständnis von synchronized irgendwie falsch, oder meine Java VM will sich nicht so recht dran halten
Also - wofür ist synchronized gut, und wie kann ich das Problem am elegantesten lösen?
Meine Idee wäre nun eine temporäre Liste als Zwischenlager zu erstellen, aus der sich der Thread immer dann, wenn er grad nicht mehr am iterieren ist, die neuen Objekte holt und in die eigentliche Hauptliste einfügt. Aber vielleicht geht das ja auch schöner?
kann mir jemand in 2 - 3 Sätzen erklären, was genau das synchronized-Statement eigentlich bewirken soll? Meine bisherige Auffassung war eigentlich immer, daß Code, der sich in einem synchronized-Block befindet, von keinem anderen Thread unterbrochen werden kann und somit am Stück ausgeführt wird, also so, als gäbe es in diesem Moment keine anderen Threads.
Das Problem ist allerdings, daß ich noch nie das Gefühl hatte, daß mir ein synchronized-Block was bringt, denn immer wenn ich einen einsetzen will, um einen Thread-Fehler zu vermeiden, ist die Wirkung gleich null.
Mein konkretes Problem sieht zur Zeit so aus:
- eine Klasse besitzt einen Thread, der hin und wieder über eine Liste von Listenern iteriert, um diese zu benachrichtigen.
- die Klasse besitzt auch eine addListener()-Funktion, die einen Listener in die Liste einträgt.
- je nachdem wie der Mond grad steht passiert beides gleichzeitig, und das ist dann natürlich problematisch, da die Iteration es nicht gerne sieht, wenn da einer einen neuen Listener reinwirft.
Jetzt war meine Idee, die Iterationen einfach in einen synchronized-Block zu setzen, aber das bringt wie gesagt überhaupt nix. Möglicherweise ist eben mein Verständnis von synchronized irgendwie falsch, oder meine Java VM will sich nicht so recht dran halten
Also - wofür ist synchronized gut, und wie kann ich das Problem am elegantesten lösen?
Meine Idee wäre nun eine temporäre Liste als Zwischenlager zu erstellen, aus der sich der Thread immer dann, wenn er grad nicht mehr am iterieren ist, die neuen Objekte holt und in die eigentliche Hauptliste einfügt. Aber vielleicht geht das ja auch schöner?