Hallo liebes Forum,
bisher habe ich nur passiv vom reichhaltigen Wissensschatz dieses Community profitiert, nun wende ich mich direkt an euch:
Ich habe folgende Situation: Verschiedene Threads erzeugen Objekte einer Klasse A (a1 bis an) - die Methoden dieser Objekte greifen nun auf ein globales Objekt B zu. (bzw. auf seine Methoden)
Ziel ist es den Zugriff der Methoden so zu synchronisieren, dass das globale Objekte immer nur von einem Thread und seinem Objekt ai benutzt werden kann. Die Methoden der Objekte (a1 bis an) sollen atomar am globalen Objekt B wirken.
Folgendes kann ich jedoch ausschließen: Es bringt nichts die Methoden der Klasse von B zu synchronisieren die von A verwendet werden, denn diese sind: read(); und write(); - sollten beide z.B. durch synchronized nur noch atomar wirken , nützt mir das wenig , weil immer noch Inkonsistenzen auftreten können.
Die Methoden von ai hingegen sollen beim Zugriff auf B synchronisiert sein. Natürlich nützt mir ein synchronized in A ebensowenig , da ja nicht der Zugriff auf die Methode von A gegen race conditions gesichert werden soll sondern der Zugriff auf das Objekt B.
An dieser dargestellten Struktur kann ich nichts ändern. Das Problem ist abstrakter Natur, ich kann darum auch leider keinen Code posten. Eine Lösung wird jedoch in Java implementiert.
Ich habe irgendwie keinen kritischen Bereich, den ich durch locks, semaphore etc. sichern könnte - d.h. ich möchte gerne den kompletten Zugriff auf das Objekt B (oder zumindest alle seine Variablen) gegen Mehrfachzugriff sperren können. Also B kann quasi immer nur von einem Thread benutzt werden.
Ich kenne im Betriebssystem von Windows NT die Möglichkeit, dass Threads sich bei Objekten anmelden können und in Warteschlangen auf den Zugriff warten bis sie den Zugang zum Objekt erhalten (Marshalling). Leider habe ich sowas nicht für Java gefunden oder bin zu blöd es zu sehen.
Ich habe ein Klassendiagramm eingefügt als Beispiel für eine solche Konstellation - hoffentlich hilfts.
Habt Ihr eine Idee wie das aussehen könnte?
Vielen Dank!
bisher habe ich nur passiv vom reichhaltigen Wissensschatz dieses Community profitiert, nun wende ich mich direkt an euch:
Ich habe folgende Situation: Verschiedene Threads erzeugen Objekte einer Klasse A (a1 bis an) - die Methoden dieser Objekte greifen nun auf ein globales Objekt B zu. (bzw. auf seine Methoden)
Ziel ist es den Zugriff der Methoden so zu synchronisieren, dass das globale Objekte immer nur von einem Thread und seinem Objekt ai benutzt werden kann. Die Methoden der Objekte (a1 bis an) sollen atomar am globalen Objekt B wirken.
Folgendes kann ich jedoch ausschließen: Es bringt nichts die Methoden der Klasse von B zu synchronisieren die von A verwendet werden, denn diese sind: read(); und write(); - sollten beide z.B. durch synchronized nur noch atomar wirken , nützt mir das wenig , weil immer noch Inkonsistenzen auftreten können.
Die Methoden von ai hingegen sollen beim Zugriff auf B synchronisiert sein. Natürlich nützt mir ein synchronized in A ebensowenig , da ja nicht der Zugriff auf die Methode von A gegen race conditions gesichert werden soll sondern der Zugriff auf das Objekt B.
An dieser dargestellten Struktur kann ich nichts ändern. Das Problem ist abstrakter Natur, ich kann darum auch leider keinen Code posten. Eine Lösung wird jedoch in Java implementiert.
Ich habe irgendwie keinen kritischen Bereich, den ich durch locks, semaphore etc. sichern könnte - d.h. ich möchte gerne den kompletten Zugriff auf das Objekt B (oder zumindest alle seine Variablen) gegen Mehrfachzugriff sperren können. Also B kann quasi immer nur von einem Thread benutzt werden.
Ich kenne im Betriebssystem von Windows NT die Möglichkeit, dass Threads sich bei Objekten anmelden können und in Warteschlangen auf den Zugriff warten bis sie den Zugang zum Objekt erhalten (Marshalling). Leider habe ich sowas nicht für Java gefunden oder bin zu blöd es zu sehen.
Ich habe ein Klassendiagramm eingefügt als Beispiel für eine solche Konstellation - hoffentlich hilfts.

Habt Ihr eine Idee wie das aussehen könnte?
Vielen Dank!