Multithreading (Prüfungsvorbereitung)

Status
Nicht offen für weitere Antworten.

Ishildur

Bekanntes Mitglied
Hallo zusammen
Ich habe nächste Woche eine Prüfung in Java Multithreading und habe hierzu ein Frage (und weitere werden vermutlich folgen 🙂 )

Ich habe ein Verständnisproblem im Zusammenhang mit den Monitors und zwar kann ich folgendes nicht so recht verstehen: Wenn ich eine synchronisierte Collection benötige, so muss ich ja meine Zugriffsmethoden nicht synchronisieren, solange ich die Methoden einfach nur delegiere:
Code:
public void add(MyObject obj){
 this.syncList.add(obj); // syncList ist ein java.util.Vector
}
Aber in diesem Fall darf ich dies ja nicht mehr so machen:
Code:
public void add(MyObject obj){
 if(this.syncList.contains(obj)) this.syncList.add(obj); // zwischen dem contains und add könnte der Thread unterbrochen werden... PFUI!!
}
Nun habe ich es folgendermassen in den Büchern gelesen:
Code:
public void add(MyObject obj){
 synchronized(this.syncList){
   if(this.syncList.contains(obj)) this.syncList.add(obj); // alles paletti
 }
}
Aber das kann ich nun icht verstehen...

Wieso kann man es nicht einfach so machen:
Code:
public synchronized void add(MyObject obj){
  if(this.syncList.contains(obj)) this.syncList.add(obj); // ist offentbar ungültig, weil mehrere Monitore
}
Könnte mir das jemand erklären? Wäre echt nett!! 😀

Mfg Ishildur

P.S.
By the way. Ich höre immer wieder, Vector sei schlecht! Wie macht man den eine synchronisierte Liste korrekt? Ich habe keine ConcurrentList gefunden?
 
> Wie macht man den eine synchronisierte Liste korrekt?

Collections#synchronizedList(List<T> list)
 
Sollte es noch irgendwo außerhalb Deiner Wrapper-Klasse Referenzen auf den Vector geben, dann könnte man darüber ja ggfs. aus anderen Threads den Vector verändern. Das würde durch das Sychronisiren auf die Wrapper-Klasse nicht verhindert werden.
 
Hehe, stimmt! 🙂 Kann mir noch jemand die Sache mit den Monitors erklären? Stehe da echt auf dem Schlauch!
 
Du meinst das letzte? Wenn ich nicht gerade einen (auf Hunger und Müdigkeit zu schiebenden :wink: ) Denkfehler habe, kann da ein Deadlock auftreten:
Code:
public synchronized void add(MyObject obj)
{
XXX  
  if(this.syncList.contains(obj)) 
  {
    this.syncList.add(obj); 
  }
}

public void doSomething add(MyObject obj)
{
  synchronized (syncList)
  {
YYY
    add(obj);
  }
}

Ein Thread könnte in der Zeile XXX stehen - er hält den Monitor "this", und wartet darauf, dass der Monitor "syncList" freigegeben wird, damit er "contains" aufrufen kann.

Ein anderer Thread steht in Zeile YYY - er hält den Monitor "syncList", und wartet darauf, dass der Monitor "this" freigegeben wird, damit der "add" aufrufen kann.

.... ???:L kann mich auch irren, aber ich denke, das würde zu einem Deadlock führen.
 
Hmm, bedeutet dies, dass jedes Objekt einen Monitor haben kann?

Also wäre folgender Code semantisch identisch?
Code:
public synchronized void doSomething(){
 // my code
}
und
Code:
public void doSomething(){
 synchronized(this){
  // my code
 }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben