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

标签 abstraction locks system-design

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

根据我的理解

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

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

    最佳答案

    我不是专家,我在网上也找不到任何东西。我可能和你在大学做同样的主题,这就是我想出的(根据个人经验)。

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

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

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

    希望有帮助 - 让我知道你的想法,这样我们就可以一起解决这个问题。

    关于abstraction - 为什么说锁违反了抽象和可组合性原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47234982/

    相关文章:

    java - 为什么抽象方法不能同步?

    python - 暂停两个 Python 线程,而第三个线程执行某些操作(带锁?)

    java - 如何确定条件变量上等待时间最长的线程?

    java - 设计一个基于插件的 java 应用程序

    tcp - 用户带宽和下载间隔之间的权衡

    php - 为本地编程竞赛系统构建客户端-服务器应用程序

    c# - 如何通过自定义多态类型的集合获得多态行为?

    c++ - 如何在 C++ 中编写内联相互抽象代码?

    php - 类方法与数据库交互的抽象不起作用,

    java - 如何在Java中拥有 volatile boolean 值数组而不是 volatile boolean 值数组?