代码之家  ›  专栏  ›  技术社区  ›  CaptainHastings

通过锁锁链

  •  3
  • CaptainHastings  · 技术社区  · 16 年前

    提到锁(Java.U.L.Copy.Loop.Load)在内部锁上的优势之一是锁有助于“链锁”。锁链是指先为A持有一把锁,然后获取B,获取B后释放A,然后获取C…

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

    干杯, 维克

    1 回复  |  直到 16 年前
        1
  •  4
  •   caskey    16 年前

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

    把这个想象成一个墨西哥煎饼吧,你有一队顾客,还有四个左右的工人在另一边。你不希望任何消费者超越其他人,也不希望任何工人一次服务于多个消费者。您可以在每台服务器之间创建队列,但是您知道管道是严格连续的,有时抽象不是代码中的最佳表示。

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

    与计算中的任何事情一样,有许多方法可以达到相同的效果,但是域模型和实现模型之间的认知距离会影响代码的清晰性。因此,如果您有一个应用程序希望确保在顺序中获取下一个资源之前不释放一个资源,那么锁链是一个方便的解决方案。

    最后,不要忘记Java的同步能力是严格嵌套的,你只能按照你获得的顺序释放一个锁。如果你有长而复杂的管道,那就不理想了。