我有一个经常访问的代码块,可以从主线程或其他几个后台线程访问。我需要确保一次只处理一个代码。
我目前正在使用@synchronized(self) { }
块,但我不确定它是否提供了正确的保护。它与NSLock
实例有什么不同?
最后,有人可以建议我如何保护我的方法吗?该方法在我的应用程序委托中,我通过调用:
从各种线程访问它[[[UIApplication sharedApplication] delegate] myMethod];
非常感谢,
麦克
答案 0 :(得分:31)
Google Mac博客上有一篇关于@synchronized
内部工作原理的精彩博文:
http://googlemac.blogspot.com/2006/10/synchronized-swimming.html
我目前正在使用 @synchronized(self){}阻止,但我 不确定是否提供了 正确的保护。它有什么不同 来自NSLock实例?
有几种方法可以同步关键部分(@synchronized, NSLock, OSSpinLock, ...)
我认为@synchronized
是最方便的(and also the slowest)方法
Here is a good SO answer解释了@synchronized和NSLock之间的区别。
您正在通过共享实例(基本上是单例)委托访问您的方法。也许您可以重新考虑您的设计并找出一种方法,允许您在myMethod
内锁定一小段代码。
答案 1 :(得分:16)
如果你确实想要一次处理一件物品,我的建议是使用NSOperations和NSOperationQueue,你将maxConcurrentOperationCount设置为1.如果你确定这是唯一的方法通过此队列中的操作访问共享代码块,您将不再需要昂贵的锁。
这可能需要对您的应用程序进行一些重组,但我发现在我自己的应用程序中应用它会带来更好的性能和更清晰的代码。