比方说,我们在单例对象上有一个NSMutableArray。单例对象显然可以从多个不同的线程调用。
比方说,我们需要单例用户能够使用addObjects或removeObjects。或者我们有一个需要设置和读取的自定义对象。
处理这些案件的正确方法是什么?单例上的每个线程不安全的属性是否都有自己的串行/并发队列,然后重写addObject和removeObject函数用于NSMutableArray,将读取封装在dispatch_sync中,然后在dispatch_async(串行队列)或dispatch_barrier_async(并发队列)中写入?
( 1)是否每个线程不安全的属性都需要自己的队列?或者至少在性能上应该有一个。如果多个属性共享同一个队列,则它将慢于所需的速度。
2)在什么情况下,这种线程保护是不必要的。有没有过?或者线程不安全的属性应该总是覆盖它们的getter和getter。
发布于 2016-03-17 19:37:09
( 1)是否每个线程不安全的属性都需要自己的队列?或者至少在性能上应该有一个。如果多个属性共享同一个队列,则它将慢于所需的速度。
这完全取决于您对序列化API的冲击频率。从一个简单的模型开始,如果需要的话,再转到更复杂的地方。
请记住,实现不一定仅限于随心所欲地添加队列。
你也可以使用一个多读取器,一个作家模型。这将涉及到保留可更改数组的内容的NSArray*副本,读者可以同时访问这些内容。如果更改了可变数组的内容,则可以(考虑到线程安全性)将可变数组的新的不可变副本交换为现有的NSArray * (可以使用原子@property完成,也可以使用并发队列进行所有读取,并为交换操作设置障碍)。
当数组相对较小(廉价副本)或读取比写入多很多倍时,上述内容可能是有意义的。
2)在什么情况下,这种线程保护是不必要的。有没有过?或者线程不安全的属性应该总是覆盖它们的getter和getter。
可变集合始终是线程不安全的,即使在“只读”模式下操作也是如此。只有不可变的集合才是线程安全的。
因此,是的,您需要确保序列化将导致线程不安全操作的任何操作。
https://stackoverflow.com/questions/36069511
复制相似问题