2009-07-21 7 views
3

Il est mentionné que l'un des avantages de Lock (java.util.concurrent.locks.Lock) par rapport au verrouillage intrinsèque est que le verrouillage facilite le "verrouillage de la chaîne". Chaîne de verrouillage étant, maintenez un verrou pour A, puis acquérir B, après avoir acquis B version A, puis acquérir C ...Verrouillage de la chaîne via le verrouillage

Je suis juste curieux, avez-vous les gars rencontré une situation dans laquelle l'utilisation de verrouillage de la chaîne était nécessaire ?

Cheers, Vic

Répondre

3

Toute situation où vous avez une série de sections critiques qui sont mutuellement indépendants, mais que vous souhaitez exécuter afin serait appropriée. Pensez à cela comme un bar à burritos, vous avez une file de consommateurs et quatre travailleurs de l'autre côté. Vous ne voulez pas que les consommateurs dépassent les autres et vous ne voulez pas que les travailleurs servent plus d'un consommateur à la fois. Vous pouvez créer des files d'attente entre chaque serveur, cependant vous savez que le pipeline est strictement séquentiel, et parfois cette abstraction n'est pas la meilleure représentation dans le code. Cependant, vous pouvez avoir une manipulation exceptionnelle où vous voulez être capable d'acquérir l'une des étapes de la canalisation. Par exemple, le caissier à la fin. Si quelqu'un vient chercher une carte-cadeau, ils peuvent sauter la file d'attente et aller directement à la caisse. Ce modèle réduit les temps d'attente/la latence moyens, tout en offrant les verrous et les garanties de séquençage nécessaires aux autres travailleurs.

Comme pour tout élément informatique, il existe plusieurs façons d'obtenir le même effet, mais la distance cognitive entre le modèle de domaine et le modèle de mise en œuvre a une incidence sur la clarté du code. Par conséquent, si vous avez une application dans laquelle vous voulez vous assurer que vous ne libérez pas une ressource avant d'avoir acquis la suivante dans la séquence, une chaîne de verrouillage est une solution pratique. Enfin, n'oubliez pas que la capacité synchronisée de java est strictement imbriquée, vous ne pouvez libérer un verrou que dans l'ordre où vous l'avez acquis. Pas idéal si vous avez des pipelines longs et compliqués.

+0

IMO, si le pipeline est séquentiel comme vous l'avez dit, il est préférable de le mettre en œuvre via Queues/Pipe; Travailleur - File d'attente - Travailleur - File d'attente - Travailleur - File d'attente - Caissier. Si un cavalier de file d'attente arrive, il entre simplement dans la file d'attente qu'il saute. Chaque travailleur apparaît à partir de sa file d'attente d'entrée et pousse vers sa file d'attente de sortie. –