Frage

Vor diesem Code:

public class Messager implements Runnable {            

  public static void main(String[] args) {   
      new Thread(new Messager("Wallace")).start();    
      new Thread(new Messager("Gromit")).start();             
  }             
  private String name;                 
  public Messager(String name) { this.name = name; }             
  public void run() {    
      message(1); message(2);    
  }           
  private synchronized void message(int n) {    
    System.out.print(name + "-" + n + " ");    
  }    
}

Ich verstehe, dass das synchronized Schlüsselwort auf der Objektsperre der Faden abhängig macht. Fragen:

a) Ist die Sperre, sobald das Verfahren als synchronized beendet markiert freigegeben? Oder sobald der run() Methode Thread beendet b) Kann ich sicher, dass einer der Threads wird seinen Namen und 1 2 vor dem anderen drucken?

War es hilfreich?

Lösung

A. Ja. Es wird freigegeben, sobald die synchronized Funktion beendet.
B. Ja. Sie können, aber wenn Sie so tun wollen, warum sollten Sie multithreaded Code in erster Linie schreiben? synchronized garantiert Atomarität, nichts die Reihenfolge in Bezug auf, aber Sie können, um erzwingen, indem Sie warten auf eine Flagge zu ändern. Wie auch immer, was Sie versuchen zu erzwingen Sequentialität . Sie erhalten diese kostenlos in Single-Threaded-Umgebungen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top