8
votes

Méthode Java empêche l'accès simultané

Comment puis-je empêcher l'accès simultané. J'ai un code comme celui-ci xxx

et je reçois une sortie comme celle-ci xxx

tout conseil?


2 commentaires

Quelle serait la sortie souhaitée?


Qu'essayez-vous d'atteindre?


6 Réponses :


8
votes

Vous avez quatre objets MC distincts. Exécution typique d'une méthode instance sur ceux ( Sync ), ils ne doivent pas interférer les uns avec les autres. Vous pouvez utiliser un bloc synchronisé pour vous assurer qu'un seul tour à la fois, mais vous devez considérer quoi synchroniser:

  • Si vous synchronisez sur un objet distinct par exemple, cela empêcherait deux threads d'exécuter le code pour le même objet . C'est efficacement ce que vous avez maintenant, mais vous synchronisez implicitement sur ce , que je vous découragerais de faire. (Tout autre code pourrait se synchroniser sur le même objet.)
  • Si vous synchronisez sur un objet qui tous les les instances connaissent (par exemple via une variable statique), cela ne laisserait qu'un thread exécute le code du tout . < / li>

    On dirait que vous voulez que cette dernière approche, mais cela ne sonne pas comme un excellent design pour moi. Si vous voulez vraiment en mettre la mise en œuvre de cette façon, vous utiliseriez: xxx

    maintenir synchroniser comme méthode synchronisée mais la rendant statique aussi travail, mais vous feriez encore une fois vous verrez un objet visible publiquement ( mc.c.class ) que je décourage généralement.


6 commentaires

bâillement - voir ma réponse: juste faire la méthode statique


@Bohemian: Comme je le dis spécifiquement à la fin de ma réponse, que serait travailler, mais cela signifie verrouiller sur un objet publiquement visible. Pas une bonne idée, IMO - J'aime pouvoir raisonner de mon code, sachant que rien d'autre ne peut se bloquer sur les mêmes objets.


@Jon_skeet: assez juste, mais franchement, la classe entière est "moins que bien conçue" et uniquement à des fins de démonstration, cette solution rapide a donc répondu à sa question "WTF se déroule".


@Bohemian: Vous pouvez choisir de donner une solution rapide si vous le souhaitez, mais je voudrais plutôt remettre en question la conception et mentionnez les meilleures pratiques en même temps. Je pense que l'OP en apprendra plus de cette façon, même si vous bâchez simplement ...


Il suffit de faire: synchronisé (mc.class) {


@iimuhin: Eh bien que travaille , mais cela signifie que vous utilisez un verrou qui peut être synchronisé ailleurs aussi. Je préfère ne jamais synchroniser sur ce ou d'autres références visibles de manière externe.



0
votes

Vous êtes instanciant quatre objets et sychronisé est sur un moniteur différent. Soit faire sync statique de sorte que la classe actuelle soit le moniteur, ou lorsque vous instaniez, transmettez le même objet de moniteur aux quatre, puis synchronisez-le


0 commentaires

13
votes

Faites de votre méthode statique:

private static synchronized void sync();


0 commentaires

0
votes

Utilisez une serrure statique Synchronisez votre méthode. Les classes de verrouillage sont à l'intérieur du package Java.ConCurrent


0 commentaires

4
votes

Pour la fonctionnalité souhaitée, vous pouvez faire la fonction de synchronisation statique. Je ne parle pas de la bonté du design. Cela fait simplement la façon dont vous aimez!

private static synchronized void sync()


0 commentaires

0
votes

salut u crée de nouvelles instances de votre classe MC, méthode synchronisée garantit un accès unique pour une instance s'il ne s'agit pas de méthode statique.

Je suggérerais que vous avez une variable statique privée dise verrouillage entier, puis synchronisez-le dessus :

Synchronisation vido privée () {

synchronisé (verrouillage) { xxx

}

}


0 commentaires