Lorsque nous parlons de verrou intrinsèque, nous nous référons à l'objet pour lequel nous demandons la serrure. ou pour la méthode synchronisée? P>
Le verrou est sur l'objet ou sur sa méthode de synchronisation? P>
Je suis confus! p>
7 Réponses :
Les méthodes synchronisées verrouillent la méthode sur l'objet est en quelque sorte équivalente à p>
Chaque objet a une serrure intrinsèque. Ces deux déclarations sont équivalentes car les deux sont synchronisantes sur la serrure intrinsèque de l'objet contenant méthodata ().
Expliquer les déclarations synchronisées à une personne qui ne comprenait pas les méthodes synchronisées n'est pas une bonne idée. Cela me confonde encore plus.
Les serrures intrinsèques sont sur l'objet:
class A
{
public synchronized void method1(){...}
public synchronized void method2(){...}
}
Je souhaite, Stackoverflow permettez-moi de +10 pour votre dernière ligne. :)
La serrure fait partie de l'objet. Chaque objet en a un et il peut être verrouillé de deux manières: p>
synchronisé (objet) {} code> bloc li>
ol>
De même, vous pouvez verrouiller la classe d'un objet au lieu de l'objet lui-même (barres mentionnées séparément pour comprendre le modificateur code> synchronisé code> avec un statique code> méthode): P >
- Utilisation du modificateur code> synchronisé sur une méthode statique de la classe pour verrouiller la classe li>
- à l'aide d'un
synchronisé (clazz) {} code> bloc où clazz code> est la classe de l'objet li>
ol>
en Java, un verrou intrinsèque est impliqué par chaque utilisation du mot clé synchronisé p>
Chaque utilisation du mot clé synchronisé est associée à l'un des deux types de verrouillage intrinsèque: p>
Un "verrouillage d'instance", attaché à un seul objet p>
Un "verrouillage statique", attaché à une classe p>
Si une méthode est déclarée synchronisée, elle acquerra la verrouillage de l'instance ou la verrouillage statique lorsqu'elle est appelée, selon qu'il s'agisse d'une méthode d'instance ou d'une méthode statique. P>
Les deux types de serrure ont un comportement similaire, mais sont complètement indépendants l'un de l'autre. P>
Acquérir le verrou d'instance ne bloque que d'autres threads d'invoquer une méthode d'instance synchronisée; Il ne bloque pas d'autres threads d'appeler une méthode non synchronisée, ni ne les empêche d'invoquer une méthode synchronisée statique. P>
De même, l'acquisition de la serrure statique ne bloque que d'autres threads d'appeler une méthode synchronisée statique; Il ne bloque pas d'autres threads d'appeler une méthode non synchronisée, ni ne les bloque d'invoquer une méthode d'instance synchronisée. P>
En dehors d'un en-tête de méthode, synchronisé (ceci) acquiert le verrou d'instance. P>
La serrure statique peut être acquise en dehors d'une en-tête de méthode de deux manières: p>
synchronisé (blac.class), en utilisant la catégorie littérale p>
synchronisé (this.getclass ()), si un objet est disponible p>
private int count = 0;
public synchronized void countFunc(){
count++;
}
Thread t1 = new Thread(new Runnable(){
public void run(){
for(int i=0;i<1000;i++){
countFunc();
}}});
Thread t2 = new Thread(new Runnable(){
public void run(){
for(int i=0;i<1000;i++){
countFunc();
}}});
In the above example, I have 2 threads trying to increment the value of count. And to prevent thread interleaving I am trying to grab an intrinsic lock by the use of synchronized keyword. Conclusively,
In this example, lock is the method block countFunc with the synchronized keyword and lock is on the count variable.
Hope this helps