Question

Compte tenu de ce 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 + " ");    
  }    
}

Je comprends que le mot-clé synchronized fait le fil dépend de verrouillage de l'objet. Questions:

a) Est-ce le verrou libéré dès que la méthode marquée comme finitions synchronized? Ou dès que la méthode de run() du fil se termine b) Puis-je faire en sorte que l'une des fils imprimera son nom et 1 2 avant l'autre?

Était-ce utile?

La solution

A. Oui. Il est libéré dès que la fonction se termine synchronized.
B. Oui. Vous pouvez, mais si vous voulez le faire, pourquoi voulez-vous écrire du code multithread en premier lieu? synchronized garantit atomicité, rien en ce qui concerne l'ordre, mais vous pouvez respecter l'ordre en attendant un drapeau pour changer. Quoi qu'il en soit, ce que vous essayez de faire respecter est séquentialité . Vous obtenez ce gratuitement dans les environnements mono-thread:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top