2010-07-12 5 views
9

J'ai 2 méthodes synchronisées dans une classe dites method1() et method2(). Un thread dit "Thread 1" détient le verrou sur cet objet de la classe en exécutant la méthode synchronisée 1() .Un autre thread dit "Thread 2", accède au verrou via method2() en même temps que "Thread 1" le verrou.deux méthodes synchronisées différentes du même objet?

Ce cas est analogue à la classe java.util.Vector ayant des méthodes add() et remove() synchronisées. Veuillez également expliquer ce cas.

Répondre

10

N ° A synchronized méthode en Java est identique à la méthode entière ayant son corps enveloppé dans un bloc synchronized (this). Donc, si un thread est dans une méthode synchronized, un autre thread ne peut pas être simultanément dans une autre synchronized méthode sur le même objet. La façon dont cela se rapporte à un Vector est que vous ne voulez pas que du code essaye de supprimer un élément alors qu'un autre code essaie d'ajouter un élément. C'est le concept d'une section critique ; Non seulement vous ne voulez pas que quelqu'un d'autre essaie de faire ce que vous faites, mais vous ne voulez pas que quelqu'un d'autre fasse quelque chose de différent qui interfèrerait.

+0

Merci Borealid .. Mais si tel est le cas, pourquoi Java fournit une synchronisation spécifique aux méthodes, il peut tout autant pour la la classe entière? – JavaUser

+1

@JavaUser: 'synchronized (this)' ne signifie pas que la classe entière est 'synchronized'. Cela signifie que vous acquérez le verrou Object de l'instance sur laquelle la méthode a été appelée. Vous ne voulez pas nécessairement que toutes les méthodes soient synchronisées (en fait, vous le ferez rarement). Pour obtenir les performances du code multithread vous devez utiliser le moins de verrous possible tout en préservant l'exactitude du programme - chaque fois que vous avez un verrou contourné, un thread attendra, ne faisant rien. – Borealid

+0

@ Borealid..le moment que j'ai défini synchronisé dans tous les moyens de la méthode, l'objet entier est verrouillé lorsque j'appelle cette méthode ..am j'ai raison? – JavaUser

3

Thread2 peut accéder au verrou mais ne peut pas entrer dans le bloc protégé par ce verrou tant que Thread1 maintient le même verrou.

+0

qui était utile. Merci! – peakit

Questions connexes