首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单例中有线程不安全对象的正确方法是什么?

问在单例中有线程不安全对象的正确方法是什么?
EN

Stack Overflow用户
提问于 2016-03-17 19:04:14
回答 1查看 134关注 0票数 1

比方说,我们在单例对象上有一个NSMutableArray。单例对象显然可以从多个不同的线程调用。

比方说,我们需要单例用户能够使用addObjects或removeObjects。或者我们有一个需要设置和读取的自定义对象。

处理这些案件的正确方法是什么?单例上的每个线程不安全的属性是否都有自己的串行/并发队列,然后重写addObject和removeObject函数用于NSMutableArray,将读取封装在dispatch_sync中,然后在dispatch_async(串行队列)或dispatch_barrier_async(并发队列)中写入?

( 1)是否每个线程不安全的属性都需要自己的队列?或者至少在性能上应该有一个。如果多个属性共享同一个队列,则它将慢于所需的速度。

2)在什么情况下,这种线程保护是不必要的。有没有过?或者线程不安全的属性应该总是覆盖它们的getter和getter。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-17 19:37:09

( 1)是否每个线程不安全的属性都需要自己的队列?或者至少在性能上应该有一个。如果多个属性共享同一个队列,则它将慢于所需的速度。

这完全取决于您对序列化API的冲击频率。从一个简单的模型开始,如果需要的话,再转到更复杂的地方。

请记住,实现不一定仅限于随心所欲地添加队列。

你也可以使用一个多读取器,一个作家模型。这将涉及到保留可更改数组的内容的NSArray*副本,读者可以同时访问这些内容。如果更改了可变数组的内容,则可以(考虑到线程安全性)将可变数组的新的不可变副本交换为现有的NSArray * (可以使用原子@property完成,也可以使用并发队列进行所有读取,并为交换操作设置障碍)。

当数组相对较小(廉价副本)或读取比写入多很多倍时,上述内容可能是有意义的。

2)在什么情况下,这种线程保护是不必要的。有没有过?或者线程不安全的属性应该总是覆盖它们的getter和getter。

可变集合始终是线程不安全的,即使在“只读”模式下操作也是如此。只有不可变的集合才是线程安全的。

因此,是的,您需要确保序列化将导致线程不安全操作的任何操作。

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

https://stackoverflow.com/questions/36069511

复制
相关文章

相似问题

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