2013-08-23 127 views
0
@synchronized(self.runningOperations) {      line 1 
[self.runningOperations addObject:operation];    line 2 
} 

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

+0

和'self.runningOperations!= nil'? – trojanfoe

+0

我觉得第一次操作对象可能不存在。 – SRI

+0

@trojanfoe我将它添加到第1行和第2行之间,它也运行tiwce,但它第一次没有运行第2行([self.runningOperations addObject:operation];),所以在第一次self.runningOperations是零,但第二次,它运行第二行代码,所以在第二次,self.runningOperations不是零。这是什么情况? – SubCycle

回答

2

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

我也观察到调试器遵循line1,line2的模式,“跳回”到line1,然后像正常时一样跳过。然而,我并没有觉得这很奇怪,我已经看到调试器做了更多不寻常的事情。

我最好的猜测是,该方案,也许在一个较低的水平是

  • 无所事事与开始时的锁,但调试器仍通过线
  • 进入同步的代码去(在这一点现在已经获得锁的关键)
  • 检查锁
  • 然后开始执行原子码。

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

+1

+1同意。添加一个'NSLog'语句来查看执行是否真的发生了两次。可能不会。 – zoul

0

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