2009-07-21 4 views
3

Es wird erwähnt, dass einer der Vorteile von Lock (java.util.concurrent.locks.Lock) gegenüber der intrinsischen Sperre darin besteht, dass Lock die "Kettenverriegelung" erleichtert. Kette Verriegelung sein, halten Sie eine Sperre für A, dann erwerben B, nach dem Erwerb B Release A und dann erwerben C ...Kettenverriegelung mit Sperre

Ich bin nur neugierig, haben Sie alle Situationen, in denen die Verwendung der Kettenverriegelung notwendig war ?

Cheers, Vic

Antwort

3

Jede Situation, wo Sie eine Reihe von kritischen Abschnitte aufweisen, die voneinander unabhängig sind, aber Sie wollen, um angemessen wäre auszuführen.

Denken Sie daran wie eine Burrito Bar, Sie haben eine Schlange von Verbrauchern und vier oder so Arbeiter auf der anderen Seite. Sie möchten nicht, dass Verbraucher andere überholen, noch möchten Sie, dass einer der Mitarbeiter mehr als einen Verbraucher gleichzeitig bedient. Sie können Warteschlangen zwischen den einzelnen Servern erstellen, obwohl Sie wissen, dass die Pipeline streng sequenziell ist und diese Abstraktion manchmal nicht die beste Darstellung im Code darstellt.

Sie haben jedoch außergewöhnliche Handhabung, wo Sie eine der Phasen der Pipeline erwerben möchten. Zum Beispiel der Kassierer am Ende. Wenn jemand einen Geschenkgutschein hereinbringt, könnte er die Warteschlange überspringen und direkt zum Kassierer gehen. Dieses Modell reduziert die durchschnittlichen Wartezeiten/Latenzzeiten und bietet gleichzeitig die erforderlichen Sperren und Sequenzierungsgarantien für andere Mitarbeiter.

Wie bei jedem Computer gibt es viele Möglichkeiten, den gleichen Effekt zu erzielen, jedoch beeinflusst die kognitive Distanz zwischen dem Domänenmodell und dem Implementierungsmodell die Code-Klarheit. Wenn Sie also eine Anwendung haben, bei der Sie sicherstellen wollen, dass Sie keine Ressource freigeben, bevor Sie die nächste in der Sequenz erworben haben, ist eine Lock-Chain eine bequeme Lösung.

Schließlich vergessen Sie nicht, dass die synchronisierte Fähigkeit von Java streng verschachtelt ist, können Sie eine Sperre nur in der Reihenfolge, in der Sie sie erworben haben, freigeben. Nicht ideal, wenn Sie lange komplizierte Pipelines haben.

+0

IMO, wenn die Pipeline sequenziell ist, wie Sie sagten, dann ist es am besten durch Warteschlangen/Pipe implementiert; Arbeiter - Warteschlange - Arbeiter - Warteschlange - Arbeiter - Warteschlange - Kassierer. Wenn ein Queue-Jumper reinkommt, betritt er einfach die Queue, zu der er springt. Jeder Worker wird aus seiner Eingabewarteschlange ausgegeben und in seine Ausgabewarteschlange verschoben. –