synchronized(self):在等待锁定时如何避免自我被破坏

时间:2015-08-13 11:28:05

标签: objective-c

请考虑以下事项:

{{1}}

在一个多线程的情况下......如何在dealloc获取锁定时阻止foo.doSomething被调用?

我认为我看到的顺序是:

  • Thread-1:输入dealloc
  • Thread-2:输入doSomething
  • Thread-1:获取自我锁定
  • 线程-2:等待自我锁定
  • Thread-1:释放锁定自我
  • 线程-2:获取自我锁定
  • Thread-1:destroy self
  • 线程-2: - BOOM - [foo release on deallocated instance],因为它试图释放锁

因为看起来很平常,bar对它的委托有一个弱引用(并且bar是一个外来类BTW,所以我无法改变这个)似乎不可能安全地释放foo的一个实例当酒吧可以随时打电话给它的代表。

我很欣赏这里的一些见解,这一定是一个标准问题,但我在这里或其他地方都没有看到过很多关于它的讨论。

1 个答案:

答案 0 :(得分:0)

使用KVO或来自多个线程的通知时,存在类似的模式和问题。看起来每个对象的串行队列可以比synchronized更好地控制它。

您可以使用NSOperationQueue创建一个maxConcurrentOperationCount。这提供了同步。 dealloc可以通过暂停队列和取消等待任务来防止在其后面等待任务的问题。