Comparez les prix des domaines et des services informatiques des vendeurs du monde entier

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


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.
Invité:

Edouard

Confirmation de:

Rétention

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:

Je pense que nous devons utiliser un château de Reentela pour ce que vous essayez de faire. Voici un fragment 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:

Java, Apparemment, prend pleinement en charge les blocages imbriqués sur un objet avec le même flux. Cela signifie que si le débit a un verrouillage externe et interne de l'objet, et l'autre flux tente de bloquer le même objet, le deuxième flux sera suspendu jusqu'à ce que

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:

À java mot-clé
synchronized

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:

Aucun problème. Dans votre exemple /Une fois que vous avez corrigé votre code pour vous débarrasser des avertissements de compilation que vous obtenez;//, La synchronisation garantit des blocs dans method1 et method2 ne sera pas effectué simultanément.

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:

Non, la deuxième méthode ne s'arrêtera pas si le premier le causera. Il n'y aura pas d'étrange résultats /À l'exception de la petite générale de blocage des chèques. Cela n'aura pas de grande valeur. Commençant par Java 6 Et plus loin, vous avez du château de glissement de terrain dans JVM -
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.

Pour répondre aux questions, connectez-vous ou registre