首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@synchronized()和NSLock差异

@synchronized()和NSLock差异
EN

Stack Overflow用户
提问于 2009-11-22 01:03:05
回答 2查看 18.8K关注 0票数 30

我有一个频繁访问的代码块,可以从主线程或其他几个后台线程访问。我需要确保这段代码一次只处理一个。

我目前使用的是@synchronized(self) { }块,但我不确定这是否提供了正确的保护。它与NSLock实例有什么不同?

最后,有人能建议我如何保护我的方法吗?该方法在我的应用程序委托中,我通过调用以下命令从各个线程访问它:

代码语言:javascript
复制
[[[UIApplication sharedApplication] delegate] myMethod];

非常感谢,

麦克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中锁定较小的代码段。

票数 31
EN

Stack Overflow用户

发布于 2009-11-22 07:49:52

如果您确实希望一次处理一个项目,我的建议是使用NSOperations和NSOperationQueue,其中将maxConcurrentOperationCount设置为1。如果您确保访问此共享代码块的唯一方式是通过此队列中的操作,则将不再需要昂贵的锁。

这可能需要对您的应用程序进行一些重组,但我发现在我自己的应用程序中应用它可以带来更好的性能和更整洁的代码。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1776042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档