2009-12-13 9 views
3

synchronisé Vu ce code:Comprendre

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) Le verrou est-il libéré dès que la méthode marquée synchronized est terminée? Ou dès que la méthode run() du thread se termine b) Puis-je m'assurer que l'un des threads affichera son nom et 1 2 avant l'autre?

+0

Vous êtes en train de verrouiller sur deux instances différentes là-bas, donc 'sycnhronized' ne fera rien. (Explicitement en utilisant le bloc 'synchronized' plutôt que le modificateur rend les choses plus claires.Mieux utiliser un objet de verrouillage séparé.) –

Répondre

2

A. Oui. Il est libéré dès que la fonction synchronized se termine.
B. Oui. Vous pouvez, mais si vous vouliez le faire, pourquoi écririez-vous du code multithread en premier lieu? synchronized garantit l'atomicité, pas n'importe quoi concernant la commande, mais vous pouvez forcer l'ordre en attendant qu'un drapeau change. De toute façon, ce que vous essayez d'appliquer est séquentialité. Vous obtenez ceci gratuitement dans des environnements à un seul thread :)

+0

Oh, je ne fais que poser une question" et si ". J'étudie pour le scjp. Merci. – andandandand

+0

dmindreader, s'il vous plaît ajouter un nouveau tag scjp aux futures questions scjp, merci. –