Objective-C中的@synchronized

时间:2013-08-23 10:18:22

标签: ios objective-c synchronized

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

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

2 个答案:

答案 0 :(得分:2)

巧合的是,我刚刚调试了一些碰巧有@synchronised的代码。

我也观察到调试器遵循line1,line2的模式,“跳回”到line1然后正常开启,就像我走过一样。我没有发现这是不寻常的,但是我看到调试器做了更多不寻常的事情。

我最好的猜测是该程序可能处于较低级别

  • 在开始时对锁无所​​作为,但调试器仍然通过该行
  • 输入同步代码(此时获取锁定至关重要)
  • 检查锁定
  • 然后开始执行原子代码。

我最好的建议是 不要将调试器的输出视为福音 。如果你在发布它几乎可以肯定是错误的,甚至在Debug中,我已经看到在不寻常的命令中突出显示步骤,我不能说为什么肯定,可能只是查看代码和编译代码之间的差异。

答案 1 :(得分:0)

如果self.runningOperation始终为nil,则无法用于同步。确保在调用@synchronized()之前已初始化它。