Quel est l'avantage de la nouvelle interface de verrouillage sur un bloc synchronisé en Java? Vous devez implémenter un cache haute performance qui permet à plusieurs lecteurs, mais un écrivain unique de conserver l'intégrité Comment la mettre en œuvre? P>
4 Réponses :
Les avantages d'une serrure sont p>
Notez que cela est expliqué dans le Javadoc of Lock et ses sous-classes. P>
Un cache haut performant pourrait être mis en œuvre à l'aide d'un concurrentMap. P>
Le point deux semble mal formulé. Vous pouvez interrompre un fil en attente d'un moniteur Java intrinsèque normal. LOCK CODE> a LockinTerruptimativement code> qui permet d'interrompre le fil tandis que bloqué l'acquisition d'un verrou.
@TOM: Vous pouvez bien sûr interrompre un fil bloqué en attente d'un moniteur intrinsèque, mais le fil ne sera pas réactif à l'interruption. C'est ce que je voulais dire: la méthode d'interruption sera appelée, mais le fil ne sera pas capable de s'interroger avant d'acquiert la serrure, et cela pourrait rester dans cet état pour toujours. J'ai changé le libellé pour le rendre plus explicite.
Le point clé est que le thread cible est dans thread.state.blocké code> non thread.state.waitting code> (ou chronométré_waitting code>).
Vous devez savoir quand utiliser le verrouillage et pour utiliser des blocs / méthodes synchronisés. P>
Utilisez des blocs synchronisés si vous créez des applications simples. Cela évite les conditions de race. Mais tout en évitant les conditions de race, vous pourriez causer des blocages. P> li>
Utilisez des serrures si vous créez des applications sérieuses. Cela évite également les conditions de la race, mais vous bénéficiez également d'éviter les blocages. P> li> ul>
Ce n'est vraiment pas les bonnes clés de choisir entre les verrous synchronisés et explicites. Une application sérieuse peut être simple et utiliser des verrous peut évidemment également conduire à des blocages comme synchronisé le fait.
Les différents avantages de l'interface de verrouillage sur la synchronisation sont énumérés ci-dessous p>
La synchronisation est le seul coupable qui conduit au problème de l'impasse, contrairement à la serrure qui est exempte de problème d'impasse. P> Li>
En synchronisation, nous ne savons pas après combien de temps un thread aura une chance après qu'un thread précédent ait libéré le verrou. Cela peut conduire à un problème de la famine alors que l'on accache de la serrure Nous avons sa serrure réentrante de classe d'implémentation qui possède l'un de ses constructeurs qui vous permet de passer une propriété d'équité comme l'un de ses arguments que le fil d'attente le plus long obtenez la possibilité d'acquérir la serrure. p> li>
en synchronisation, si un thread attend un autre thread, le fil d'attente ne nécessite aucune autre activité qui ne nécessite pas d'accès à verrouillage, mais avec une interface de verrouillage, une méthode TryLock () avec laquelle vous Peut essayer d'accéder à la serrure et si vous n'obtenez pas le verrou, vous pouvez effectuer d'autres tâches alternatives. Cela aide à améliorer les performances de l'application. P> li>
Il n'y a pas d'API pour vérifier le nombre de threads attendant une serrure particulière alors que cela est possible avec la classe de mise en œuvre de l'interface de verrouillage Méthodes de réentrantlock. p> li>
On peut obtenir un meilleur contrôle des verrous à l'aide d'une interface de verrouillage avec une méthode HoldCount () introuvable avec la synchronisation. P> LI> ol>
L'avantage majeur des interfaces de verrouillage sur la programmation multi-threadé et simultanée est constitué de deux serrures distinctes pour la lecture et l'écriture, ce qui vous permet d'écrire une structure de données haute performance comme Concourshashmap et un blocage conditionnel. P>
Un thread ne peut prendre une serrure qu'une seule fois. Les blocs synchronisés n'offrent aucun mécanisme d'une file d'attente en attente et après la sortie d'un thread, tout thread peut prendre la serrure. Cela pourrait entraîner la famine de ressources pour un autre fil pendant une très longue période. P>
LOCK CODE> n'est guère nouveau, cela fait partie de Java5, c'est-à-dire depuis 2004