Re: einfaches Problem beim Synchronisieren
- From: Ernst Baumann <carlox@xxxxxx>
- Date: Fri, 30 Nov 2007 08:46:53 +0100
Für die Laufzeitumgebung sind nicht diese beiden variablen gelockt,....
sondern es gibt nur ein Lock für MyLockObjekt. Dieses Lock kann zu
einem Zeitpunkt maximal ein Thread "besitzen".
Ein Thread der unterbrochen wird (egal ob an einem Lock oder aus einem....
anderen Grund) macht genau an der Stelle weiter wo er angehalten hat.
Er wartet _vor_ dem synchronized, und zwar so lange bis kein andererDanke für deine Ausführungen.
Thread mehr in einem synchronized-Block für das gleiche Objekt ist,
was aber in diesem Fall nie passieren wird da der andere Thread in
einer Endlosschleife festhängt.
1)
Ich habe dies mal mit meinen Wortne formuliert:
Alle Schlösser der durch synchronized eingezäunten, kritischen
Bereiche dieses Programms haben ein gemeinsames Schloß im Objekt
MyLockObjekt.
Wenn also alle mit synchronized eingezäunten, kritischen Bereiche ein
gemeinsames Objekt haben, das in runden Klammern dem Bezeichner
synchronized folgt, also hier synchronized(MyLockObjekt) dann werden
diese durch synchronized eingezäunten, kritischen Bereiche durch das
gemeinsame Schloß in diesem Objekt MyLockObjekt synchronisiert.
D.h: befindet sich das Programm gerade in einem durch synchronized
eingezäunten, kritischen Bereich eines Threads, dann muss ein anderer
Thread, der auf einen _anderen_ kritischen Bereich des _gleichen_
Schlosses zugreifen will, so lange _vor_ dem durch synchronized
eingezäunten, kritischen Bereich warten, bis der andere Thread, der
den kritischen Bereich gerade durchläuft (d.h. das Schloss
abgeschlossen hat) und die Anweisungen dieses Bereichs abarbeitet,
dieses Schoß wieder aufschließt, d.h. den durch synchronized
eingezäunten, kritischen Bereich wieder verlassen hat.
Ist das korrket?
2)
Ich habe in dem alten Demoprogramm wait und notify eingefügt (siehe
unten)
Dann funktioniert es.
Kommt das davon her, dass durch wait das Schloß zeizweise wieder
aufgeschlossen wird (bis zum Aufruf von wait) und dadurch im anderen
Thread der synchronized Bereich abgearbeitet werden kann?
-----Demoprogramm mi wait und notify----------------------------
public class MainSynchronisieren2 {
public static void main(String[] args){
ThreadErzeuger einThreadErzeuger = new ThreadErzeuger();
ThreadVerbraucher einThreadVerbraucher = new
ThreadVerbraucher(einThreadErzeuger);
Thread t1 = new Thread (einThreadErzeuger);
Thread t2 = new Thread (einThreadVerbraucher);
t1.start();
t2.start();
}
}
class ThreadErzeuger implements Runnable{
public int zahl;
public boolean verbraucherArbeitetGerade;
public Object MyLockObjekt = new Object();
public ThreadErzeuger(){
zahl = 0;
verbraucherArbeitetGerade = false;
}
public void erzeuge(){
synchronized(MyLockObjekt){
while(verbraucherArbeitetGerade==true){
try{
MyLockObjekt.wait();
System.out.println("while-Schleife Erzeuger");
}
catch(Exception e){
System.out.println("Hallo");
}
}
zahl = zahl + 2;
System.out.println("Zahl im Erzeuger = "+zahl);
verbraucherArbeitetGerade=true;
MyLockObjekt.notify();
}
System.out.println("E: Ende synchronisierung");
}
public void verbrauche(){
synchronized(MyLockObjekt){
System.out.println("Hallo 1");
while(verbraucherArbeitetGerade==false){
try{
MyLockObjekt.wait();
System.out.println("while-Schleife Erzeuger");
}
catch(Exception e){
System.out.println("Hallo");
}
}
zahl = zahl - 1;
System.out.println("Zahl im Verbraucher = "+zahl);
verbraucherArbeitetGerade=false;
MyLockObjekt.notify();
}
}
public void run(){
while(zahl<1000){
System.out.println("Beginn ThreadErzeuger");
erzeuge();
System.out.println("Ende ThreadErzeuger");
}
}
}
class ThreadVerbraucher implements Runnable{
ThreadErzeuger erzeuger;
public ThreadVerbraucher(ThreadErzeuger pErzeuger){
erzeuger = pErzeuger;
}
public void run(){
while(true){
System.out.println("Beginn ThreadVerbraucher");
erzeuger.verbrauche();
System.out.println("Ende ThreadVerbraucher");
}
}
}
----------------------------------------------------------------
3)
Ich habe noch ein kleines Problem:
Warum wird in dem kleinen Programm unten nicht richtig synchronisiert,
d.h. es werden die Zahlen nicht exakt in aufsteigender Reihenfolge
ausgegeben (es gibt einen Ausreißer).
Kannst du mir das exakt begründen?
----------------------------------------------------------------
public class MainSynchronisieren4 {
public static void main(String[] args){
ThreadCounter tc1 = new ThreadCounter();
ThreadCounter tc2 = new ThreadCounter();
Thread t1 = new Thread (tc1);
Thread t2 = new Thread (tc2);
t1.start();
t2.start();
}
}
class ThreadCounter implements Runnable{
public static int zahl=0;
public Object MyLockObjekt = new Object();
public void run(){
while(zahl<1000)
synchronized(MyLockObjekt){
System.out.println(zahl++);
}
}
}
----------------------------------------------------------------
mfg
Ernst
.
- Follow-Ups:
- Re: einfaches Problem beim Synchronisieren
- From: Paul Ebermann
- Re: einfaches Problem beim Synchronisieren
- From: Michael Justin
- Re: einfaches Problem beim Synchronisieren
- References:
- einfaches Problem beim Synchronisieren
- From: Ernst Baumann
- Re: einfaches Problem beim Synchronisieren
- From: David Grabandt
- Re: einfaches Problem beim Synchronisieren
- From: Ernst Baumann
- Re: einfaches Problem beim Synchronisieren
- From: Guido Weber
- einfaches Problem beim Synchronisieren
- Prev by Date: Re: Swing-Tree
- Next by Date: Re: Welches Verzeichnis ist konkret das default-package
- Previous by thread: Re: einfaches Problem beim Synchronisieren
- Next by thread: Re: einfaches Problem beim Synchronisieren
- Index(es):
Relevant Pages
|