Re: einfaches Problem beim Synchronisieren





Hier holt sich t1 das Lock auf das MyLockObjekt.

while(verbraucherArbeitetGerade==true){
System.out.println("while-Schleife Erzeuger");
}

Und wenn t1 2x mal hintereinander an die Reihe kommt steckt er hier in
einer endlos Schleife fest und gibt das Lock nicht mehr frei.

1)
Was heißt "gibt das Lock nicht mehr frei" ?
Das bedeutet doch (so wie ich es verstanden habe), dass auf die
"gelockten"Variablen
zahl und
verbraucherArbeitetGerade
von einem anderem Thread aus nicht mehr zugegriffen werden kann,
oder?`

2)
Aber selbst wenn der "Lock nicht mehr freigegeben wird", müsste doch
der verbraucherthread einmal zum Zug kommen.
Aber was passiert dort?
Der VerbraucherThread versucht dort auf die Variable zahl zuzugreifen.
Da diese vom ErzeugerThread geschützt wird (gelockt ist), wird dem
VerbraucherThread der Zugriff verweigert.
_Die_ Frage ist:
_Wo_, anwelcher Stelle (siehe die Pfeile unten) des VerbraucherThreads
macht beim nächsten Mal, wenn der VerbraucherThread wieder an der
Reihe ist, dieser VerbraucherThread wieder weiter?

public void run(){
--> while(true){
--> System.out.println("Beginn ThreadVerbraucher");
--> erzeuger.verbrauche();
--> System.out.println("Ende ThreadVerbraucher");
}
}


3)
Wie reagiert der VerbraucherThread, wenn dieser VerbraucherThread
irgendwann an die mit
synchronized(MyLockObjekt)
bezeichnete Stelle kommt?
Macht er dann _nach_ diesem mit synchronized bezeichneten Block im
VerbraucherThread weiter, oder was geschieht?

t2 kommt
also nicht mehr in den synchronized(MyLockObjekt){}-Block(unten
markiert). Ergo kann dieser nichts machen.

Wo t2 beim nächsten Mal weitermacht, weiß icht nicht.
Das ist mein Problem.

[Rest vom Programm gesnipped]

Mein Vorschlag, wenn du über das verbraucherArbeitetGerade steuern
willst, solltest du den synchronized-Block weglassen,

in allen zwei Threads ?
Aber wie soll ich dann garantieren, dass nicht "gleichzeitig" alle
zwei Threads auf die Variable
verbraucherArbeitetGerade
zugreifen?

oder du steuerst
über dein MyLockObjekt und lässt die while-Schleifen weg.

Wie soll die Steuerung aussehen?
mit wait und notify (ich will dies erst mal ohne diese Hilfsmittel
machen)

mfg
Ernst
.