代码之家  ›  专栏  ›  技术社区  ›  Starwolf-001

为什么说锁违反了抽象和可组合性原则?

  •  5
  • Starwolf-001  · 技术社区  · 7 年前

    我没有在谷歌上找到任何明确的答案,甚至没有找到StackOverflow来回答这个问题。

    据我所知

    • 使用锁的线程可以破坏抽象
    • 锁不可组合

    但是锁如何以及为什么打破抽象和可组合性呢?

    2 回复  |  直到 7 年前
        1
  •  2
  •   CallumJHays    7 年前

    我不是专家,在网上也找不到任何东西。我可能和你在大学学的是同一个科目,以下是我的想法(根据个人经验)。

    锁对抽象原理提出的问题是,锁及其资源的状态可能无法由当前执行的指令集的状态确定。例如,在C++中,您可能有一个Baker类,该类需要对某些Oven对象进行互斥访问。面包师需要经常使用烤箱(打开/关闭/放入物品),并且需要独占访问烤箱才能这样做,但是这不能真正抽象出来,因为他何时需要这种互斥访问可能会影响他的功能。

    我们可能需要向我们的系统添加独立于面包师的功能,但需要相互排斥地访问面包师正在使用的同一个烤箱。在实现这些更改时,由于锁如何同时依赖于多个线程的状态,我们不能保证先前抽象的Baker类的行为在程序的运行时保持不变。(例如:如果烤箱被另一个线程使用,面包师可能会决定等待30分钟,然后再检查烤箱是否空闲,这可能是不必要的、低效的行为)。

    由于同样的问题,锁也违反了可组合性原则,因为在多线程应用程序中,如果程序的不同组件相互依赖,则它们无法无缝组合。

    希望这能有所帮助-让我知道你的想法,这样我们就可以一起得分了。

        2
  •  0
  •   Naveen    6 年前

    非正式地说,可组合性意味着获取两个或多个功能程序,并从中生成更大的程序。合成应基于已发布的接口,不知道内部细节。

    提到 https://en.wikipedia.org/wiki/Lock_(computer_science)#cite_note-5 . 在本例中,如果不知道锁定协议(account类的实现细节),则无法正确编写传输方法