链锁通过锁

时间:2009-07-21 18:05:17

标签: java concurrency locking

提到Lock(java.util.concurrent.locks.Lock)优于内部锁的优点之一是Lock有助于“链锁定”。链锁定为,持A锁定,然后获得B,获得B释放A后获得C ...

我只是好奇,你们有没有遇到过使用锁链的情况?

干杯, 维克

1 个答案:

答案 0 :(得分:4)

任何情况下,你有一系列相互独立的关键部分,但你希望按顺序执行是适当的。

把它想象成一个墨西哥卷饼吧,你有一个消费者队列,另一边有四个左右的工人。您不希望任何消费者跳过其他消费者,也不希望任何一个消费者一次为多个消费者提供服务。您可以在每个服务器之间创建队列,但是您知道管道是严格顺序的,有时候抽象不是代码中的最佳表示。

但是,如果您希望能够获得管道的其中一个阶段,您可以进行特殊处理。例如,收银员在最后。如果有人进来购买礼品卡,他们可以跳过队列直接前往收银台。该模型减少了平均等待时间/延迟,同时为其他工作人员提供必要的锁定和排序保证。

与计算中的任何内容一样,有许多方法可以实现相同的效果,但域模型和实现模型之间的认知距离会影响代码清晰度。因此,如果您有一个应用程序要确保在获取序列中的下一个资源之前不释放一个资源,则锁定链是一种方便的解决方案。

最后,不要忘记java的同步功能是严格嵌套的,你只能按照获取它的顺序释放锁。如果你有很复杂的管道,那就不理想了。