2012-02-12 3 views
2

J'étudie actuellement la concurrence Java. J'ai une question à propos de synchronized et des serrures.Synchronzied Getter et Setter

Pour toute donnée mutable, nous devrions mettre toute la méthode accédant aux données dans le même verrou.

Mais, que signifie le même verrouillage?

Exemple:

public class SynchronizedInteger{ 
    private int value; 
    public synchronized int get(){return value;} 
    public synchronized void set(int value){this.value=value;} 
} 

Alors, ma question est pourquoi ces deux méthodes sont dans la même serrure? Je sais qu'ils le sont, mais j'aimerais savoir pourquoi? Et, cela signifie-t-il que toutes les méthodes synchronisées de la classe sont dans le même verrou?

Edit:

donc, si j'ajouté une méthode à la classe:

public synchronized void printOneToHunder(){

for(int i=0;i<100;i++) System.out.println(i); 

}

Cette méthode sera également inclus dans un même bloc que setter et getter? Donc, un autre thread ne peut pas exécuter cette méthode quand il y a un thread utilisant setter ou getter?

Et, si je change la classe ci-dessous:

public class SynchronizedInteger{ 
    private int value1; 
    private int value2; 
    public synchronized int get1(){return value1;} 
    public synchronized void set1(int value){this.value1=value1;} 
    public synchronized int get2(){return value2;} 
    public synchronized void set2(int value){this.value2=value2;}  
} 

Pour ma compréhension en ce moment, un seul thread peut appeler ces méthodes à un moment donné. Alors, comment faire pour qu'un thread puisse modifier value1 et l'autre thread pour modifier value2 ???

Merci beaucoup pour vos précieuses clarifications !!!!

+1

Toutes les méthodes synchronisées d'un objet utilisent le même objet de verrouillage, qui est l'objet lui-même, par définition. Voir http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html –

Répondre

5

Toutes les méthodes non statiques que vous déclarez synchronized se comportent essentiellement comme si le code était:

public synchronized int get() { 
    synchronized(this) { 
    // the method code 
    } 
} 

dire il y a un verrou implicite this prise. Toutes les méthodes synchronisées non statiques verrouillent donc l'instance sur laquelle elles sont appelées.

Les méthodes synchronisées statiques prennent un verrou sur l'objet de classe lui-même, plutôt que sur une instance de cette classe.

+1

Je crois que vous voulez dire 'public int get() {' dans votre exemple de code. –

4

Oui, vos deux méthodes utilisent le même verrou.

Le mot-clé synchronized sans paramètre est implicitement traduit en syncrhonized(this), qui est le même objet pour les deux méthodes.

Pour que deux blocs aient "le même verrou" dans java, cela signifie qu'ils utilisent tous les deux le même objet qu'un verrou. Et comme je l'ai dit, dans votre cas, les deux méthodes utilisent this comme objet de verrouillage.

0

Lorsque vous déclarez une méthode synchronized, cela signifie que la synchronisation est sur l'instance particulière pour laquelle la méthode est appelée.

0

Mais vous avez d'autres moyens de synchronisation.

blocs: Synchronisé synchronized(someLockedObj){somecode}

lock-objets: Lock lock = new ReentrantLock(); lock.lock(); lock.unlock();