多线程daata访问问题,@ synchronized&串行队列

时间:2014-04-30 09:52:26

标签: ios queue nslock

正如您可能已经经历过的那样,访问非线程安全变量是一件非常令人头痛的问题。对于iOS,一个简单的解决方案是使用关键字 @synchronized,这将添加NSLock以确保数据可以由唯一的一个线程访问,缺点是下面:

  1. 锁定太多会大大降低应用程序性能,尤其是在主线程调用时。

  2. 逻辑变得复杂时会发生死锁。

  3. 基于以上考虑,我们更喜欢使用串行队列来处理,每个线程安全的关键操作都会附加到队列的末尾,这是一个很好的解决方案,但问题是所有的访问接口都应该按设计asyn风格,请参阅以下内容。

    -(id)objectForKey:(NSString *)key;
    

    调用此类的人不会不愿意这样设计。任何有此领域经验的人请一起分享和讨论。

1 个答案:

答案 0 :(得分:0)

最终的解决方案是使用NSUserDefault来存储小数据,对于大型缓存数据,将它们放在我们自己维护的文件中。

根据Apple doc,NSUserDefault的优点是线程安全,并且会定期同步工作。