8
votes

Quelle est la différence entre les méthodes et les blocs synchronisés?

Quelle est la différence entre synchronisé méthodes et synchronisé instections ?

Si possible, veuillez utiliser un exemple pour le rendre plus clair.


1 commentaires

Je pense que La réponse de Partylcloudy est la plus succincte.


5 Réponses :


3
votes

synchronisé sur la méthode est verrouillé sur un cet objet . Il est égal à synchronisé (this) {}

standard synchronisé est verrouillé sur un objet / moniteur spécifié. Avec synchronisé (***) {} Vous pouvez choisir un objet à utiliser pour le verrouillage.


0 commentaires

4
votes

A Méthode synchronisée est une méthode dont le corps est encapsulé automatiquement dans un bloc synchronisé .

Ainsi, ceci est égal: xxx


0 commentaires

8
votes

Citations de la JLS (y compris l'exemple):

JLS 14.19 Le synchronisé code> relève h3> blockQuote>

A 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>

A 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>

Ce sont les mêmes serrures pouvant être utilisés par l'instruction code> synchronisée code>; Ainsi, le code: 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) {
                ...
        }
    }
}


0 commentaires

2
votes

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.


0 commentaires

13
votes

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.

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).


0 commentaires