Re: einfaches Problem beim Synchronisieren
- From: Ernst Baumann <carlox@xxxxxx>
- Date: Thu, 29 Nov 2007 17:47:41 +0100
1)
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.
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 kommtWo t2 beim nächsten Mal weitermacht, weiß icht nicht.
also nicht mehr in den synchronized(MyLockObjekt){}-Block(unten
markiert). Ergo kann dieser nichts machen.
Das ist mein Problem.
in allen zwei Threads ?
[Rest vom Programm gesnipped]
Mein Vorschlag, wenn du über das verbraucherArbeitetGerade steuern
willst, solltest du den synchronized-Block weglassen,
Aber wie soll ich dann garantieren, dass nicht "gleichzeitig" alle
zwei Threads auf die Variable
verbraucherArbeitetGerade
zugreifen?
Wie soll die Steuerung aussehen?
oder du steuerst
über dein MyLockObjekt und lässt die while-Schleifen weg.
mit wait und notify (ich will dies erst mal ohne diese Hilfsmittel
machen)
mfg
Ernst
.
- Follow-Ups:
- Re: einfaches Problem beim Synchronisieren
- From: Guido Weber
- Re: einfaches Problem beim Synchronisieren
- References:
- einfaches Problem beim Synchronisieren
- From: Ernst Baumann
- Re: einfaches Problem beim Synchronisieren
- From: David Grabandt
- einfaches Problem beim Synchronisieren
- Prev by Date: Re: Buffered Reader
- Next by Date: Re: Buffered Reader
- Previous by thread: Re: einfaches Problem beim Synchronisieren
- Next by thread: Re: einfaches Problem beim Synchronisieren
- Index(es):