在Objective-C中锁定实例变量

10

在iOS应用中,防止一个对象在另一个对象使用它时更改实例变量的最佳方法是什么?使用@synchronized(self)指令就足够了吗?

提前致谢


这是实例变量,而不是类变量。仅凭如此少的信息没有人可以可靠地告诉你。 - Daij-Djan
如果一个人认为这就是提问者的意思,那么修改问题(“类变量”->“实例变量”)真的是个好主意吗?从阅读他之前的问题和答案来看,他实际上可能是指“类变量”。 - Martin R
抱歉,我的错,我应该说“静态变量”,它是一个标志,其值需要在类的所有实例之间共享,并确保它只能在某个特定时间由一个实例更改。 - AppsDev
希望下面的答案有所帮助。我认为Justin一针见血地指出了问题所在。另外,FYI,请参阅《线程编程指南》的Synchronization部分。 - Rob
3个回答

5

1
我认为@synchronize(或其他无数同步机制之一)被用来确保线程安全。不可否认,如果使用不当,它将无法正常工作。是的,有更好的方法来实现线程安全代码(例如Tips for Thread Safety)。但无论如何,您能否澄清一下您的观点,即synchronize不能使其线程安全?我认为这就是同步技术的全部目的。 - Rob
@Rob:终于在这里找到了。我还在面试中学到了这个技能 :p - Anoop Vaidya
1
哦,我忘记粘贴了 :p https://dev59.com/K2gv5IYBdhLWcg3wF89P - Anoop Vaidya
1
太好了。我实际上对那篇文章很熟悉(我是其中一个“赞成票”)。我认为第一个观点(“折叠1”)的被接受答案在线程安全方面是误导的,因为他侧重于“使用相同的同步令牌”(嗯,显而易见)。总之,我的理解是@synchronize可以用来确保线程安全,尽管正如该帖子(以及我上面提供的链接)所证明的那样,有更好的方法来做到这一点。这不像常见的误解,即atomic确保线程安全(它并不是)。@synchronize可以,但有更好的方法。语义学,我想。 - Rob
1
是的,我同意你的观点。关于原子性,我在stackoverflow上发布了一个问题:https://dev59.com/Mmct5IYBdhLWcg3wHJzF :) - Anoop Vaidya

4
在iOS应用程序中,防止一个对象在另一个对象使用实例变量时更改它的最佳方法是什么?
一种好的旧锁机制,例如;您还可以使用此的Objective-C包装器(例如和)。@synchronized也属于这个类别,但它是在此处提到的最高级别机制。
当然,优秀的并发解决方案通常与设计更改、程序流程、偏爱不可变性等有关。仍然会有一些情况需要使用互斥/锁定。
不幸的是,纯ObjC/Cocoa在这个领域严重缺乏——仅使用ObjC和Cocoa技术开发高效并发程序比它应该或需要的要困难得多。
@synchronized(self)指令的使用是否足够?
对于简单情况,它是足够的。它是一个对象级别的递归锁。
然而,与其他互斥选项相比,它相当慢。
我认为@synchronized除了以下几点之外没有太多优点:
方便开发人员引入(可能会产生不良副作用)和对称性(它确保解锁与锁匹配),与替代方案相比极大地降低了死锁的概率(这是一个非常好的属性)。
@synchronized很方便,但由于成本高昂,应谨慎使用。

1
如果唯一的目的是能够访问,则保留HTML标记。
self.myString; //getter

和,

self.myString=aString; //setter

最好的方法是将其声明为原子性的,例如:
@property (atomic, strong) NSString* myString;

这将确保在多线程环境中,线程1设置和获取myString时受到保护,以防线程2对其进行操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接