0
@synchronized(self.runningOperations) {                      line 1
 [self.runningOperations addObject:operation];               line 2
} 

当我调试这些代码时。首先它运行第1行,然后转到第2行。没关系,但是在此之后,它再次转到第1行,然后转到第2行,然后跳出@synchronized . 但是当我打印 runningOperations 时,它第一次运行第 2 行代码时,对象没有添加到 self.runningOperations 中,它是在第二次添加的。为什么它运行两次,为什么第二次将对象添加到 self.runningOperations 中?

4

2 回答 2

2

巧合的是,我刚刚调试了一些恰好有@synchronised.

我也观察到调试器遵循 line1、line2、“跳回”到 line1 的模式,然后正常运行,因为我逐步完成。然而,我并没有发现这很不寻常,我看到调试器做了更多不寻常的事情。

我最好的猜测是该程序,也许在较低级别是

  • 在开始时对锁什么都不做,但调试器仍然通过那行
  • 输入同步代码(此时获得锁至关重要)
  • 检查锁
  • 然后开始执行原子代码。

我最好的建议是不要将调试器的输出视为福音。如果您处于发布状态,则几乎可以肯定它是错误的,即使在调试中,我也看到过以不寻常的顺序突出显示单步执行,我无法确定为什么,可能只是查看的代码和编译的代码之间存在差异。

于 2013-08-23T13:16:38.803 回答
0

如果self.runningOperation是的话,nil它不能用于同步。确保在调用它之前对其进行初始化@synchronized()

于 2013-08-23T12:28:40.153 回答