我有一个频繁访问的代码块,可以从主线程或其他几个后台线程访问。我需要确保这段代码一次只处理一个。
我目前使用的是@synchronized(self) { }块,但我不确定这是否提供了正确的保护。它与NSLock实例有什么不同?
最后,有人能建议我如何保护我的方法吗?该方法在我的应用程序委托中,我通过调用以下命令从各个线程访问它:
[[[UIApplication sharedApplication] delegate] myMethod];非常感谢,
麦克
发布于 2009-11-22 01:22:54
在Google Mac博客上有一篇关于@synchronized内部工作原理的很棒的博客文章
http://googlemac.blogspot.com/2006/10/synchronized-swimming.html
我目前正在使用@synchronized(self) {}块,但我不确定这是否提供了正确的保护。它与NSLock实例有什么不同?
有几种同步临界区(@synchronized, NSLock, OSSpinLock, ...)的方法。
我认为@synchronized是最方便的(and also the slowest)方法。
解释@synchronized和NSLock之间差异的Here is a good SO answer。
您正在通过共享实例(基本上是单例)委托来访问您的方法。也许您可以重新考虑您的设计,并找出一种方法,允许您在myMethod中锁定较小的代码段。
发布于 2009-11-22 07:49:52
如果您确实希望一次处理一个项目,我的建议是使用NSOperations和NSOperationQueue,其中将maxConcurrentOperationCount设置为1。如果您确保访问此共享代码块的唯一方式是通过此队列中的操作,则将不再需要昂贵的锁。
这可能需要对您的应用程序进行一些重组,但我发现在我自己的应用程序中应用它可以带来更好的性能和更整洁的代码。
https://stackoverflow.com/questions/1776042
复制相似问题