10

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

提前致谢

4

3 回答 3

5

如果您希望一个对象被阻塞,以便没有两个线程同时使用它,那么 @synchronize 是一种方法。但这并不能使它成为线程安全的

您也可以使用GCD(Grand Central Dispatch )

于 2013-03-13T12:55:59.733 回答
4

在 iOS 应用程序中,防止实例变量在另一个对象使用它时被对象更改的最佳方法应该是什么?

一把好的旧锁,例如pthread_mutex;你也可以使用这个的Objective-C 包装器(例如NSLockand NSRecursiveLock)。@synchronized也属于这一类,但它是这里提到的最高级别的机制。

当然,卓越的并发解决方案通常更多地与设计变更、程序流程、支持不变性等有关。仍然存在首选或需要互斥/锁定的情况。

不幸的是,这个领域非常缺乏纯 ObjC/Cocoa —— 仅使用 ObjC 和 Cocoa 技术开发一个高效的并发程序比它应该(或需要)要困难得多。

@synchronized(self) 指令的使用是否足够?

对于简单的情况,它就足够了。它是一个对象级递归锁

但是,与其他互斥选项相比,它非常慢。

我不认为@synchronized它有什么好处,除了:

  • 方便开发人员介绍(可能有不好的副作用)和
  • 对称性(它确保解锁匹配锁定),与替代方案相比,大大降低了死锁的概率(一个非常好的属性)。

@synchronized方便,但因为成本高,所以要慎用

于 2013-03-13T13:34:51.220 回答
1

如果唯一的目的是能够访问

self.myString; //getter

和,

self.myString=aString; //setter

最好的方法是将其声明为原子,例如:

@property (atomic, strong) NSString* myString;

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

于 2013-03-13T12:55:38.353 回答