2010-09-11 5 views
6

Je suis nouveau sur les threads Java et la synchronisation.Java question synchronisée

Disons que j'ai:

public class MyClass(){ 

    public synchronized void method1(){ 
     //call method2(); 
    } 

    public synchronized void method2(){}; 

} 
  1. Qu'est-ce que cela signifie quand je synchronisez un method1() sur un objet d'instance? Donc, quand un thread a acquis le verrou en essayant d'accéder au synchronized method1(), cela empêche-t-il les autres threads d'accéder à un autre synchronized method2() à partir de ce même objet?

  2. permet de dire un fil un verrou lors de l'accès method1(), mais permet de dire que method1() fait un appel à method2() qui est aussi synchronized. Cela peut-il être possible? Je veux dire, y at-il des règles qui peuvent empêcher method1() d'appeler method2()?

Merci d'avance.

Répondre

4
  1. See here:

    il est impossible pour deux appels de méthodes synchronisées sur le même objet à entrelacer. Lorsqu'un thread exécute une méthode synchronisée pour un objet, tous les autres threads qui invoquent des méthodes synchronisées pour le même bloc d'objet (suspendent l'exécution) jusqu'à ce que le premier thread soit fait avec l'objet.

  2. Depuis ce fil maintient le verrou sur l'objet courant, il peut invoquer method2(), et aucun autre ne peut fil.

7
  1. Oui, en utilisant le modificateur de procédé synchronized sur une méthode non statique signifie qu'il utilise le moniteur de l'occurrence du procédé est invoqué sur, et ceci est partagée entre toutes ces méthodes. Non - le thread possède déjà le moniteur, il est donc libre d'entrer d'autres blocs protégés par le même moniteur.
2

Une note sur la question 2, method1() peut également appeler des méthodes synchronisées également dans autres classes qui pourrait provoquer une impasse:

Thread1 appels method1 synchronisé() qui doit son tour appeler method_b synchronisé() dans AnotherClass Thread2 détient le verrou sur AnotherClass et exécute une méthode qui doit appeler method1() dans la classe dont verrou est détenu par Thread1

les deux fils bloqueront attendant que l'autre pour libérer le verrou, un impasse.

2

(1) Cela équivaut à:

public void method1(){ 
    synchronized (this) { 
     ... 
    } 
} 

Il synchronise sur l'instance en cours. Si nous réécrivons la méthode 2 de la même manière ...

public void method2(){ 
    synchronized (this) { 
     ... 
    } 
} 

...alors vous pouvez clairement voir qu'ils verrouillent sur le même objet et ainsi d'autres threads ne pourraient pas appeler method1 ou method2 jusqu'à ce que method1 quitte son bloc synchronized.

(2) synchronized blocs sont rentrants, ce qui signifie que le même thread peut entrer dans d'autres blocs synchronized qui verrouillent le même objet autant de fois qu'il le souhaite. Si je comprends bien, chaque fois que vous entrez dans un bloc synchronized, Java augmente un compteur sur l'objet que vous synchronisez par 1, et chaque fois que vous quittez un bloc synchronized, il le diminue. Lorsque ce compteur atteint 0, le verrou est libéré.