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 !!!!
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 –