Quelle est la différence entre Si possible, veuillez utiliser un exemple pour le rendre plus clair. P> synchronisé code> méthodes em> et
synchronisé code> instections em>? P>
5 Réponses :
standard synchronisé code> sur la méthode est verrouillé sur un
cet objet code>. Il est égal à
synchronisé (this) {} code> p>
synchronisé code> est verrouillé sur un objet / moniteur spécifié. Avec
synchronisé (***) {} code> Vous pouvez choisir un objet à utiliser pour le verrouillage. P>
A Ainsi, ceci est égal: p> Méthode synchronisée code> est une méthode dont le corps est encapsulé automatiquement dans un bloc code> synchronisé code>.
Citations de la JLS (y compris l'exemple):
synchronisé code> relève
h3> blockQuote>
A A Ce sont les mêmes serrures pouvant être utilisés par l'instruction code> synchronisée code>; Ainsi, le code: p>
Synchronisée code> L'instruction acquiert une serrure d'exclusion mutuelle au nom du thread d'exécution, exécute un bloc, puis libère la serrure. Bien que le fil d'exécution possède la serrure, aucun autre thread ne peut acquérir la serrure. P>
blockQuote>
JLS 8.4.3.6
Synchronisé code> Méthodes
h3>
Synchronisé code> La méthode acquiert un moniteur avant d'exécuter. Pour une méthode de classe (
statique code>), le moniteur associé à l'objet code> code> de la classe de la méthode est utilisé. Pour une méthode d'instance, le moniteur associé à
ceci code> (l'objet pour lequel la méthode a été invoquée) est utilisé. P>
class BumpTest {
int count;
void bump() {
synchronized (this) {
count++;
}
}
static int classCount;
static void classBump() {
try {
synchronized (Class.forName("BumpTest")) {
classCount++;
}
} catch (ClassNotFoundException e) {
...
}
}
}
Une méthode synchronisée est celle où vous avez, en effet, placée tout le corps de la fonction dans un bloc synchronisé. Un bloc synchronisé présente l'avantage que vous pouvez appliquer le bloc synchronisé à quelques instructions de sélectionner dans la fonction, au lieu de la fonction dans son ensemble. En général, il est préférable de faire des blocs synchronisés aussi courts que possible, car le temps passé dans des blocs synchronisés est temps que certains autres threads peuvent être empêchés de faire du travail significatif. Une autre distinction est que vous pouvez spécifier un objet particulier sur lequel appliquer la serrure lors de l'utilisation d'un bloc synchronisé, tandis qu'avec une méthode synchronisée, l'objet, lui-même est automatiquement utilisé comme verrou sur lequel la synchronisation est effectuée. P>
Une méthode synchronisée verrouille le moniteur associé à l'instance de la classe (c.-à-d. «Ceci») ou la classe (si une méthode statique) et empêche les autres de le faire jusqu'au retour de la méthode. Un bloc synchronisé peut verrouiller tout moniteur (vous le dites) et peut avoir une portée inférieure à celle de la méthode d'encolage. p>
Les blocs synchronisés sont préférés s'ils ne finissent pas l'équivalent à l'ensemble de la portée de la méthode et / ou s'ils verrouillent quelque chose de moins draconien que l'instance (ou la classe si statique). p>
Je pense que La réponse de Partylcloudy est la plus succincte.