Question

nous avons deux threads accédant à une liste via une méthode synchronisée. Pouvons-nous

a) comptez sur le temps d’exécution pour vous assurer que chacun d’entre eux aura accès à la méthode en fonction de l’ordre dans lequel il a essayé de se lancer ou

b) la machine virtuelle respecte-t-elle d'autres règles

c) existe-t-il un meilleur moyen de sérialiser les demandes?

Était-ce utile?

La solution

Non, synchronisé donnera accès dans n'importe quel ordre (dépend de l'implémentation de la machine virtuelle Java). Cela pourrait même amener Threads à mourir de faim dans certains scénarios.

Vous pouvez assurer la commande en utilisant ReentrantLock (depuis Java 5.0) avec l’option fair = true . ( Lock lock = new ReentrantLock (true); )

Autres conseils

Non, vous ne pouvez pas être sûr que deux appels à une méthode synchronisée se produiront dans l'ordre. L'ordre n'est pas spécifié et dépend de la mise en œuvre.

Ceci est défini dans les 17.1 Serrures section du JLS. Notez que cela ne dit rien sur l'ordre dans lequel les threads en attente d'un verrou doivent avoir accès.

Vous ne pouvez pas vous fier à l'ordre dans lequel la méthode est appelée à partir de chaque thread. Si ce n'est que deux fils peuvent être oui. Mais imaginons s’il existe 3 threads et 1 thread déjà acquis l’accès. Les 2 autres threads lorsqu’ils essaieront d’accéder attendent et l’accès peut être attribué à chacun d’entre eux, ce qui ne dépend pas de l’ordre dans lequel ils ont appelé cette méthode. Il n’est donc pas suggéré de s’appuyer sur la commande.

  

c) existe-t-il un meilleur moyen de sérialiser les demandes?

Utilisez-vous la liste en tant que file d'attente, c'est-à-dire que le modèle d'utilisation ressemble à ceci?

while (some condition) {
    synchronized(theList){
        anItem = get and remove an element from theList
    }
    do some work with anItem
}

Si tel est le cas, consultez BlockingQueue au lieu d'utiliser vos propres schémas de verrouillage. Les mises en œuvre (comme ArrayBlockingQueue ) ont des paramètres d’équité et plus encore.

Je laisse toujours les synchronisations sur le serveur d'applications ou le moteur, sauf si vous définissez leur propre intensité

Oui.

Si l'accès à la liste s'effectue via une méthode synchronisée, les demandes simultanées de plusieurs threads seront sérialisées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top