Objective-C:@synchronized最佳使用

我想知道,如果我有一个需要同步的对象并且它存在于代码块中的几个(2-3)位置,那么将@synchronized添加到整个块或者在每个对象之前是否更好(更快)发生?

@synchronized (someObj) {
 [someObj removeAllObjects];        
}

..

@synchronized (someObj) {
 [someObj addobject:[NSNumber numberWithInt:203]];      
}

VS

@synchronized (someObj) {

 [someObj removeAllObjects];

... (potential a large block of code)

[someObj addobject:[NSNumber numberWithInt:203]];

... (potential a large block of code)       
}

有什么想法吗?

解决方法

JeremyP所说的都是真的.还有一些其他事情需要考虑.如果第一个代码片段适合您,那么可以推断您在(长代码块)期间不关心任何中间状态. (即你不是在@synchronized块之外从这个数组中读取,对吧?)在这种情况下,你最好还是批量完成需要同步的操作并一次完成所有这些操作.例如:

..
id objectToAdd = [NSNumber numberWithInt: 203];    
..

@synchronized (someObj) 
{
    [someObj removeAllObjects]
    [someObj addobject:objectToAdd];      
}

一般来说:并发性和性能通过减少锁定次数以及持有它持有多长时间来改善.在这个简单的例子中,没有任何迹象表明我们不能一次,而不是两次,而且,没有迹象表明我们不能像上面那样批处理操作,明确地将所有不需要同步的代码保持在同步块.

也就是说,“让它工作;让它正常工作;让它快速工作.” – 以该顺序.在您测量应用程序并发现锁定争用存在问题之前,我不会浪费大量时间/精力来优化您的锁定策略.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...