Je crois qu'une meilleure comparaison entre ReentrantLock et synchronized
. ReadWriteLock sert un but différent et n'est donc pas directement analogue synchronized
. Dans ce code, il semble y avoir aucune raison d'être à l'aide d'un ReadWriteLock
, mais c'est peut être juste l'absence de code.
Un ReentrantLock
est non structurées, à la différence de synchronized
des constructions -- c'est à dire que vous n'avez pas besoin d'utiliser une structure de bloc de verrouillage et peut même placer un verrou sur les méthodes. Un exemple:
private ReentrantLock lock;
public void foo() {
...
lock.lock();
...
}
public void bar() {
...
lock.unlock();
...
}
Ces flux est impossible de représenter par un seul moniteur en synchronized
construire.
A côté de cela, ReentrantLock
prend en charge de verrouillage d'interrogation et interruptible de verrouillage attend que le soutien de délai. ReentrantLock
également en charge configurable à l'équité de la politique, en permettant plus flexible de planification de thread.
Le constructeur de cette classe accepte une option de l'équité paramètre. Lorsque réglé true
, en vertu de la prétention, de serrures faveur de l'octroi de l'accès à la plus longue-thread en attente. Sinon ce verrou ne garantissent pas un accès particulier de l'ordre. Les programmes utilisant juste les verrous consulté par de nombreux threads peut afficher plus faible débit global (c'est à dire, sont plus lents; souvent beaucoup plus lent) que ceux utilisant le paramètre par défaut, mais ont de plus petits écarts dans les temps à obtenir des verrous et de garantir l'absence de faim. Notez cependant, que l'équité de serrures ne garantit pas l'équité de la planification de thread. Ainsi, l'un des nombreux fils à l'aide d'un juste serrure peut obtenir plusieurs fois de suite, tandis que d'autres threads actifs ne progressent pas et qui ne détiennent pas de la serrure. Notez également que l'intemporel tryLock
méthode ne fait pas honneur à l'équité de réglage. Elle réussit si le verrou est disponible, même si d'autres threads sont en attente.
ReentrantLock
peut également être plus évolutif, d'effectuer beaucoup mieux en plus conflictuel. Vous pouvez lire plus à ce sujet ici.
Cette affirmation a été contestée, cependant; voir le commentaire suivant:
Dans le réentrant de verrouillage de test, une nouvelle serrure est créé à chaque fois, donc il n'est pas exclusif de verrouillage et les données qui en résulte n'est pas valide. Aussi, l'IBM lien propose pas de code source pour le sous-jacent de référence, donc il est impossible de caractériser si le test a même été réalisés correctement.
Quand devez-vous utiliser ReentrantLock
s? Selon que developerWorks article...
La réponse est assez simple, l'utiliser lorsque vous avez réellement besoin de quelque chose, il prévoit que l' synchronized
n'est pas, comme chronométré attente de verrouillage, interruptible attente de verrouillage, non-structurées par bloc de serrures, de multiples variables de condition, ou d'un lock de l'interrogation. ReentrantLock
a également l'évolutivité des avantages, et vous devez les utiliser si vous avez une situation qui présente une grande contention, mais n'oubliez pas que la grande majorité des synchronized
blocs presque jamais présenter de contention, sans parler de haute lice. Je vous conseille de développement avec synchronisation jusqu'à ce que la synchronisation s'est avérée insuffisante, plutôt que de simplement en supposant que "le rendement sera meilleur" si vous utilisez ReentrantLock
. Rappelez-vous, ce sont des outils avancés pour les utilisateurs avancés. (Et vraiment les utilisateurs avancés ont tendance à préférer le plus simple des outils dont ils peuvent se trouver jusqu'à ce qu'ils sont convaincus les outils simples sont insuffisantes.) Comme toujours, le faire d'abord, et puis vous soucier de savoir si ou non vous avez pour le rendre plus rapide.