Domanda

Dato questo codice:

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 + " ");    
  }    
}

Mi rendo conto che la parola chiave synchronized rende il filo dipende blocco dell'oggetto. Domande:

A) è il blocco rilasciato non appena il metodo contrassegnato come finiture synchronized? O non appena il metodo run() del thread finisce b) Posso garantire che uno dei fili sarà stampare il suo nome e 1 2 prima che l'altro?

È stato utile?

Soluzione

A. Sì. E 'rilasciato non appena la funzione synchronized finisce.
B. Sì. È possibile, ma se si voleva farlo, perché si scrivere codice multithreading, in primo luogo? synchronized garantisce atomicità, non nulla per quanto riguarda l'ordine, ma è possibile imporre l'ordine da parte in attesa di una bandiera per cambiare. Ad ogni modo, ciò che si sta cercando di far rispettare è sequenzialità . È possibile ottenere questo gratuitamente in ambienti single-threaded:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top