Comment fonctionne la Synchronisation en Java?
J'ai un doute concernant Java de Synchronisation . Je veux savoir si j'ai trois méthodes Synchronisées dans ma classe et un fil acquiert un verrou sur une méthode synchronisée deux autres pourront être verrouillées ? Je pose cette question parce que je suis confondue avec l'instruction suivante .
Alors qu'un thread est à l'intérieur d'une méthode synchronisée d'un objet, tous les autres threads qui souhaitent exécuter cette méthode synchronisée ou de toute autre méthode synchronisée de l'objet devra attendre. Cette restriction ne s'applique pas à le thread qui a déjà de la serrure et de l'exécution d'une méthode synchronisée de l'objet. Une telle méthode peut appeler d'autres méthodes synchronisées de l'objet sans être bloqué. Le non-synchronisé méthodes de l'objet de cours peut être appelé à tout moment par n'importe quel thread
Re: "...deux autres pourront être verrouillées". Le thread en cours d'exécution qui a déjà la serrure ne sera pas empêché de l'appel d'une autre méthode synchronisée sur le même objet, cependant, toute autre thread sera bloqué (c'est à dire forcé d'attendre jusqu'à ce qu'ils sont, compte tenu de la serrure). Max a une bonne réponse qui en parle si vous êtes le verrouillage de l'objet lui-même (ce) ou d'une autre variable objet entièrement.
on peut comprendre les notions de base de la synchronisation à partir d'ici, dzone.com/articles/how-synchronization-works-in-java-part-1
OriginalL'auteur Raj | 2012-06-25
Vous devez vous connecter pour publier un commentaire.
De synchronisation en java se fait par le biais de aquiering le moniteur sur un Objet spécifique. Par conséquent, si vous faites cela:
Ces deux blocs seront protégés par l'exécution de 2 threads différents, à tout moment, tout en
someVariable
n'est pas modifié. Fondamentalement, il est dit que ces deux blocs sont synchronisés par rapport à la variablesomeVariable
.Quand vous mettez
synchronized
sur la méthode, il signifie la même chose quesynchronized (this)
, qui est, une synchronisation sur l'objet de cette méthode est exécutée.Qui est:
Signifie la même chose que:
Donc, pour répondre à votre question, oui, les threads ne sera pas en mesure d'appeler simultanément ces méthodes dans des threads différents, car ils sont à la fois la tenue d'une référence à la même moniteur, le moniteur de
this
objet.Merci pour la correction, la mise à jour.
Ne pas obtenir ce que vous avez transmises dans le premier paragraphe, pouvez-vous me l'expliquer plus simplement.
ce que j'ai compris c'est que le synchronisée méthodes qui sont "verrouillés". Le non-synchronisé méthodes de l'objet peut être appelé à tout moment par n'importe quel thread, comme indiqué dans la question implique que d'autres threads peuvent toujours appeler en parallèle *ou dans le même temps, les méthodes qui ne sont pas synchronisés
Comme je l'ai expliqué dans ma réponse, une "méthode synchronisée" n'est rien de plus que d'un raccourci à un bloc synchronisé sur un objet.
OriginalL'auteur bezmax
Oui.
Pour exécuter la méthode synchronisée thread besoin d'obtenir le verrou sur l'objet et un seul thread à la fois peut obtenir le verrou sur l'objet.
OriginalL'auteur xyz
Chaque objet java (instance de classe) a un objet mutex. Le mot-clé synchronized en face d'une méthode signifie que le thread en cours d'exécution est d'obtenir le verrou sur le mutex pour cet objet. En fait,
Est exactement la même chose que ceci:
Alors oui, il n'y aura qu'un seul thread d'exécution d'une méthode synchronisée par instance de classe.
Noter que, parfois, cela peut être sous-optimale, puisque vous voulez protéger modifications, mais sont très bien avec simultanées lit, dans ce cas, au lieu de la synchronisation de mot-clé, vous voudrez peut-être regarder dans ReadWriteLock.
OriginalL'auteur Miquel
bien, il y a un seul verrou par objet. et tous synchronisés méthodes sont verrouillés par ce verrou. Donc , selon ce thread acquiert de verrouillage à un moment, il est autorisé à passer par toutes les méthodes synchronisées. Mais les fils qui attend le verrou ne peut pas entrer dans synchroniser méthodes jusqu'à ce qu'ils obtiennent la serrure.
À un moment seulement que les thread règles et les autres ont à attendre pour saisir toute méthode synchronisée, n'a pas d'importance la décision thread exécute la méthode ou pas.
OriginalL'auteur Ahmad
Oui, tous les threads, mais celui qui a acquis la serrure devra attendre jusqu'à ce que le verrou est libéré de nouveau pour être en mesure d'exécuter l'une des trois méthodes synchronisées.
Rappelez-vous, une méthode synchronisée est le même comme une méthode normale entouré par
OriginalL'auteur Johannes Weiss
C'est vrai, et il fait de cette manière. Il est nécessaire à la cohérence des données de cet objet.
Supposons que cette validation n'est pas là et il y a une variable x qui est manipulé par 2 différentes méthode synchronisée xxx() et yyy().
donc, si Un Thread obtient de verrouillage de la méthode de xxx() qui est la manipulation de x=5 et le deuxième thread B se fait de verrouillage de la méthode yyy() et la manipulation de x=-5 donc à la fin de la méthode de xxx() thread attend x=5, mais il x=0 ce qui est mauvais.
C'est pourquoi il est mis en œuvre dans ce sens.
OriginalL'auteur Pramod Kumar
Si une classe a 4 synchroniser les méthodes, alors oui, à un moment, un seul thread aura accès à ces méthodes.
Je suppose que le doute était ici, chaque thread peut accéder diff synchronisé méthodes à la fois pour la seule instance de la classe. La réponse est non. Un seul thread peut accéder à synchronisée méthodes à la fois.
OriginalL'auteur Farhaz Malik
Je ne suis pas sûr de ce que vous trouvez à confusion, mais l'acquisition d'un verrou qui bloque les autres threads de l'acheter alors que vous la maintenez, et tous les non-synchronisée statique méthodes d'une classe synchroniser sur le même objet, donc la réponse à votre question est "oui", en supposant que je vous ai bien compris. Je ne sais pas quoi d'autre "synchronisé" pourrait signifier, ou de l'utilisation qu'il serait avec toute autre signification.
OriginalL'auteur user207421