gpt4 book ai didi

design-patterns - 观察者模式 : Avoiding bad re-entrant behavior?

转载 作者:行者123 更新时间:2023-12-04 21:45:27 24 4
gpt4 key购买 nike

在实践中,观察者模式的实现如何避免由于可重入引起的不良行为?

为了澄清“不良行为”,请考虑在单线程同步实现中模式中的主题具有方法 MethodA() 和 MethodB()、事件 OnMethodA() 和 OnMethodB() 以及一个或多个观察者的情况:

  • 调用 Subject.MethodA(),
  • Subject 对 MethodA() 执行它所做的事情,然后为所有观察者调用 OnMethodA(),
  • Observer1 获取 OnMethodA() 事件,并调用 Subject.MethodB(),
  • Subject 对 MethodB() 执行它所做的事情,然后为所有观察者调用 OnMethodB(),

  • 此时,我们正在为所有观察者调用 OnMethodB(),即使我们仍处于 OnMethodA() 通知的中间。这意味着列表中 Observer1 之后的任何观察者都会在“OnMethodA()”之前看到“OnMethodB()”——这是不好的行为。
  • Observer2(由对Observer1 一无所知的开发人员编写)获取OnMethodB() 事件,并调用Subject.MethodA(),
  • …永远。 Subject.MethodA() -> Observer.OnMethodA() -> Subject.MethodB() -> Observer.OnMethodB() -> Subject.MethodA() -> 等等...

  • 现在你要溢出堆栈。那是不好的行为。

    如果您从一开始就设计了异步的、基于队列的通知,或者在通知期间调用 Subject 时抛出异常,则可以避免这种情况,这很容易理解。困扰我的是我几乎从未认为这是实现该模式的最佳(或实际上,唯一)实践。您必须已经意识到该问题才能在 google 上搜索“观察者模式可重入”,并且该搜索的结果似乎只是遇到问题的人,而不是有关模式的书中的警告。

    所以我错过了什么吗?在实践中,观察者模式的实现如何避免由于可重入引起的不良行为?

    最佳答案

    至于避免重入,一个“修复”是设置一个标志 isResponding , isUpdating , 任何。检查它以避免重入。附言让它volatile .

    我并不是说这是一个优雅的甚至是一个好的解决方案。但有时这是一种方法。

    关于design-patterns - 观察者模式 : Avoiding bad re-entrant behavior?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15189722/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com