Hey Leute,
ich habe eine Frage zu den Parallelitätskonzepten in JAVA und zwar bietet Java einem Funktionen wie wait/notify für die Threadübergreifende Signalisierung und Verständigung.
Ich verstehe voll und ganz den Sinn bzw. die zugrundeliegende Intuition hinter wait/notify, wundere mich aber etwas, dass es keine Möglichkeit gibt so etwas wie wait/notify ohne lock zu nutzen, d.h. Signalisierungen aus Blöcken heraus in denen nicht synchronisiert wird, in JAVA zu nutzen.
So wie ich das verstanden habe sind wait/notify stets ein einen lock gebunden, da wait meist eine zu überprüfende Bedingung (meist eine while-Schleife) vorausgeht und es evtl. ungünstig wäre, wenn ein fremder Thread sich zwischen der Bedingungsüberprüfung und dem wait schaltet.
Was ist aber, wenn ich keine Bedingung vorher in diesem Sinne überprüfen muss?
Einfachstes Beispiel wäre hier evtl der Versuch eine simple Barriere mittels wait/notify nachzuprogrammieren.
Stellen wir uns dafür zwei Threads T_1 und T_2 vor, welche wir an einem bestimmten Punkt synchronisieren möchten, von der wir aus irgendeinem Grund wissen, dass T_1 diesen Punkt als erstes erreich wird. Man könnte an dieser Stelle dann einfach wait in T_1 aufrufen und an der korrespondieren Stelle in T_2 einfach ein notify.
Die Bedingung wäre dann, dass T_1 entsprechende Stelle erreicht und es wäre kein while und somit auch kein lock nötig beim Aufruf von wait.
Zusammenfassend:
Aus welchem Grund werden einem im Java keine primtiven Singnalisierungs-Konzepte zur Verfügung gestellt, welche sich entsprechend zu wait/notify verhalten und unabhängig von einem lock sind?
Auch in der Literatur zur parallelen Programmierung werden in der Regel zunächst simple Singnalisierungs-Konzepte vorgestellt (welche unabhängig von einem lock sind) und anschließend aufbauend Singnalisierungs-Konzepte welche implizit mit Locks umgehen können, d.h. diese implizit freigeben und wieder anfordern (wie in JAVA wait/notify)
Vielen Dank für eure Mühe im Voraus.
Beste Grüße
ich habe eine Frage zu den Parallelitätskonzepten in JAVA und zwar bietet Java einem Funktionen wie wait/notify für die Threadübergreifende Signalisierung und Verständigung.
Ich verstehe voll und ganz den Sinn bzw. die zugrundeliegende Intuition hinter wait/notify, wundere mich aber etwas, dass es keine Möglichkeit gibt so etwas wie wait/notify ohne lock zu nutzen, d.h. Signalisierungen aus Blöcken heraus in denen nicht synchronisiert wird, in JAVA zu nutzen.
So wie ich das verstanden habe sind wait/notify stets ein einen lock gebunden, da wait meist eine zu überprüfende Bedingung (meist eine while-Schleife) vorausgeht und es evtl. ungünstig wäre, wenn ein fremder Thread sich zwischen der Bedingungsüberprüfung und dem wait schaltet.
Was ist aber, wenn ich keine Bedingung vorher in diesem Sinne überprüfen muss?
Einfachstes Beispiel wäre hier evtl der Versuch eine simple Barriere mittels wait/notify nachzuprogrammieren.
Stellen wir uns dafür zwei Threads T_1 und T_2 vor, welche wir an einem bestimmten Punkt synchronisieren möchten, von der wir aus irgendeinem Grund wissen, dass T_1 diesen Punkt als erstes erreich wird. Man könnte an dieser Stelle dann einfach wait in T_1 aufrufen und an der korrespondieren Stelle in T_2 einfach ein notify.
Die Bedingung wäre dann, dass T_1 entsprechende Stelle erreicht und es wäre kein while und somit auch kein lock nötig beim Aufruf von wait.
Zusammenfassend:
Aus welchem Grund werden einem im Java keine primtiven Singnalisierungs-Konzepte zur Verfügung gestellt, welche sich entsprechend zu wait/notify verhalten und unabhängig von einem lock sind?
Auch in der Literatur zur parallelen Programmierung werden in der Regel zunächst simple Singnalisierungs-Konzepte vorgestellt (welche unabhängig von einem lock sind) und anschließend aufbauend Singnalisierungs-Konzepte welche implizit mit Locks umgehen können, d.h. diese implizit freigeben und wieder anfordern (wie in JAVA wait/notify)
Vielen Dank für eure Mühe im Voraus.
Beste Grüße