2014-09-08 3 views
0

J'ai une question qui peut sembler très basique mais la voici. Comme on le sait couramment dans Java, le mot-clé synchronize est utilisé pour gérer plusieurs threads accédant à une instance particulière. Maintenant, imaginez si une instance A a une méthode synchronisée do(). Cela signifie-t-il que si un thread T1 exécute la méthode do() et acquiert donc le verrou de A, aucun autre thread n'accèdera à l'instance A tant que T1 n'aura pas libéré le verrou (même si les autres méthodes ne sont pas synchronisées)? ou cela signifie que toutes les méthodes non synchronisées (ou blocs de code) sont accessibles à l'exception de la méthode do() qui peut être exécutée par un seul thread à la fois?Que fait exactement "synchroniser"?

+0

Je ne vois pas de bonnes réponses ici. La question plus ancienne que quelqu'un a lié à a une bonne réponse à _why_ et _when_ à utiliser «synchronized», mais pas de réponse concise à ce qu'il fait réellement. La réponse est simple: la JVM ne permettra pas à deux threads de se synchroniser sur le même objet en même temps. C'est tout ce qu'on peut en dire. Souvenez-vous qu'une méthode d'instance synchronisée se synchronise sur 'this', et qu'une méthode statique synchronisée se synchronise sur l'objet de classe, et c'est tout ce que vous devez savoir sur ce que' synchronized' fait réellement _does_. –

Répondre

0

Si T1 obtient un verrou sur la méthode do(), c'est que le procédé est sous bloc synchronisé. et une autre partie du programme disent que la méthode display() n'est pas synchronisée alors d'autres threads peuvent accéder à cette méthode. Donc votre ou est correct.

0

Une méthode synchronisée garantit que cette méthode n'est pas appelée pour plusieurs instances d'objet simultanément et également pendant l'exécution d'une méthode synchronisée toutes les variables d'instance associées sont actualisées avant de commencer l'exécution de la méthode.

1

droite de la Java documentation:

Il est impossible pour deux appels de méthodes synchronisées sur le même objet à entrelacer. Lorsqu'un thread exécute une méthode synchronisée pour un objet, tous les autres threads qui invoquent des méthodes synchronisées pour le même bloc d'objet (suspendent l'exécution) jusqu'à ce que le premier thread soit fait avec l'objet.

Par conséquent, votre dernière explication est correcte.