2010-02-21 5 views
1

J'ai étudié les internes de Java depuis un certain temps. Je suis curieux d'apprendre et de comprendre comment le threading/verrouillage se déroule en Java. Ainsi, afin d'accéder à une méthode synchronisée ou à un bloc synchronisé, le thread doit d'abord acquérir le verrou sur l'objetJava threads internes

Donc, maintenant, voici ce dont j'ai besoin d'un peu plus de lumière. Donc, à chaque fois que le thread acquiert le verrou sur l'objet, incrémente-t-il en interne la valeur du sémaphore? Si la réponse est oui, jetons un coup d'œil à ce scénario.

class ABC{ 

    public void method_1(){ 
     synchronized(xyz){ 
      .... 
     } 
    } 

    public void method_2(){ 
     ... 
     synchronized(xyz){ 
      .... 
     } 
    } 
} 

Donc, dire il y a deux fils: Threaad 1 et 2. Discussion Supposons que le Thread1 premier et method_1 entrés donc acquis un verrou sur xyz premier. Et, disons maintenant, Thread2 entre la méthode_2 et tente d'acquérir un verrou sur xyz. Que va-t-il arriver? (Pour moi, Thread2 sera bloqué car il trouve que la valeur de sémaphore de l'objet> 0)

Faites-moi savoir si mon raisonnement est correct.

+0

Oui. Quelle est la question? Vous répétez essentiellement la définition de la façon dont un verrou est documenté pour fonctionner. –

+0

Oui, votre description est correcte à un niveau général. Y a-t-il quelque chose à propos de cette description qui n'a aucun sens pour vous? –

Répondre

1

chaque fois que le thread acquiert le verrou sur l'objet, incrémente-t-il la valeur interne du sémaphore? Mise en œuvre spécifique, mais peu probable Étant donné que chaque verrou ne peut être obtenu qu'une seule fois, aucun compteur n'est nécessaire. Une simple bascule fera l'affaire. Je suppose que chaque verrou contient une référence au Thread qui le possède (ou null).

Mise à jour: En fait, c'est un peu plus complexe que ça. Le verrou doit également gérer une liste de threads qui l'attendent. En outre, un thread peut temporairement libérer un verrou via le mécanisme wait/notify (il y aura donc un compteur d'entrée). En plus de cela, la gestion des serrures a un grand impact sur les performances, de sorte qu'il y a toutes sortes d'optimisations en cours. J'ai trouvé ce interesting blog par quelqu'un qui travaille sur le verrouillage de la JVM. Donc, disons qu'il y a deux threads: Threaad 1 et Thread 2. En supposant que Thread1 a entré method_1 en premier, il a d'abord acquis un verrou sur xyz. Et, disons maintenant, Thread2 entre dans method_2 et essaye d'acquérir le verrou sur xyz. Que va-t-il arriver?

Oui, le thread 2 sera bloqué et attendez qu'il puisse éventuellement obtenir le verrou.

1

Votre raisonnement est à peu près correct. Thread 2 sera bloqué et restera bloqué jusqu'à (au moins) Thread1 libère le mutex. Cependant, le verrou n'est généralement pas mis en œuvre en utilisant un sémaphore conventionnel avec un compteur simple. Typiquement, il y a un seul bit de verrouillage qui n'est "gonflé" que si l'objet est verrouillé de manière réentrante (par exemple si Thread1 tente de verrouiller xyz alors qu'il détient déjà le verrou sur cet objet) ou lorsqu'il y a conflit pour le verrou (par exemple, lorsque Thread2 tente de verrouiller xyz alors que Thread1 l'a verrouillé). Mais vous n'avez pas besoin de vous préoccuper des détails d'implémentation des verrous Java ... sauf si vous implémentez vous-même une JVM!