Synchronisation deux fois sur le même objet?
Je me demandais si je reçois Java Un comportement étrange, si vous synchronisez deux fois avec le même objet?
Le script ressemble à ceci
Les deux méthodes utilisent l'objet et synchronisent dessus. Est-ce que la deuxième méthode s'arrête lorsque vous appelez la première méthode, car elle est bloquée?
Je ne le pense pas, parce que c'est le même fil, mais je ne suis pas sûr de tout autre résultat étrange qui pourrait survenir.
Le script ressemble à ceci
pulbic class SillyClassName {
object moo;
...
public void method1//{
synchronized/moo/
{
....
method2//;
....
}
}
public void method2//{
synchronized/moo/
{
doStuff//;
}
}
}
Les deux méthodes utilisent l'objet et synchronisent dessus. Est-ce que la deuxième méthode s'arrête lorsque vous appelez la première méthode, car elle est bloquée?
Je ne le pense pas, parce que c'est le même fil, mais je ne suis pas sûr de tout autre résultat étrange qui pourrait survenir.
Aucun résultat connexe trouvé
Invité:
Pour répondre aux questions, connectez-vous ou registre
6 réponses
Edouard
Confirmation de:
Les blocs synchronisés sont utilisés
Réintéractique
Verrouillage, ce qui signifie que si le débit contient déjà le verrou, il peut le recevoir sans problèmes. Par conséquent, votre code fonctionnera comme vous vous attendez.
Voir le bas de la page
https://docs.oracle.com/javase/tutorial/index.html
https://docs.oracle.com/javase ... .html
.
Citation comme 2015-01 an…
Synchronisation retenue
Rappelez-vous que le débit ne peut pas obtenir un blocage appartenant à un autre flux. Mais le flux peut avoir un blocage, qu'il possède déjà. La résolution du flux pour obtenir le même blocage plus d'une fois fournit
Retentir la synchronisation
. Cela décrit la situation lorsque le code synchronisé, directement ou indirectement, provoque une méthode qui contient également un code synchronisé et les deux ensembles de code utilisent le même blocage. Sans la synchronisation de retentéractiste, un code synchronisé devrait prendre de nombreuses précautions supplémentaires pour éviter de bloquer le flux lui-même.
Charles
Confirmation de:
http://docs.oracle.com/javase/ ... .html
.
Qu'entendons-nous par une serrure réapparrable? Il existe simplement le nombre d'acquisitions associées au blocage, et si le flux qui détient la serrure la reçoit à nouveau, le nombre d'acquisitions augmente, puis le blocage doit être libéré deux fois pour libérer vraiment le verrouillage. Il correspond à la sémantique synchronized; Si le flux entre dans un bloc synchronisé, protégé par un moniteur appartenant déjà au flux, le débit sera autorisé à fonctionner et le blocage ne sera pas supprimé lorsque le débit sortez de la seconde. /ou suivant/ Bloc synchronisé et ne sera supprimé que lorsqu'il sort du premier bloc synchronisé dans lequel il est entré, protégé par ce moniteur.
Bien que je ne l'ai pas encore essayé, je pense que si vous voulez faire ce que vous avez ci-dessus, vous devez utiliser le verrou rentré.
Gaspard
Confirmation de:
tout les deux
Les serrures ne seront pas libérées par le premier flux.
Mes tests ont été effectués au numéro Java 6 SE.
Charles
Confirmation de:
La méthode est principalement synchronisée avec l'objet actuel. En fait, cela fait de ce que vous offrez implicitement.
Vous ne rencontrerez pas de problèmes de synchronisation sur un objet dans une méthode, puis de la synchronisation sur le même objet dans une autre méthode, car, comme vous le dites, le flux actuel détient déjà un verrou sur cet objet.
Francois
Confirmation de:
Ceci est une sorte de point de synchronisation. :/
Edit: Désolé, j'ai raté une partie de votre question, mais Phil lui répondit. Résumé, on peut dire qu'un flux ne peut pas se bloquer.
Gaetan
Confirmation de:
https://www.oracle.com/java/te ... .html
./
Par exemple, jetez un coup d'œil au code source. java.util.Vector. Il existe de nombreux appels à d'autres méthodes synchronisées à partir de méthodes synchronisées.