【发布时间】:2017-02-23 06:49:26
【问题描述】:
我正在 Objective-C 中设计一个单例类,它将被多个线程访问。我的班级有 3-4 个NSMutableArrays,外部班级可以通过 read、add 和 remove 操作进行访问,这些操作当然包含在这个班级中。
由于NSMutableArray 不是线程安全的,我使用@synchronized() 使我的操作线程安全,但是它会导致@synchronized() 块的使用过多。
因为对于每个 3-4 个数组,我至少有 1 个添加函数、1 个删除函数和 5 次我需要读取值。因此,对于 1 个数组,我至少使用 7 个 @synchronized() 块。
对于 4 个数组,我需要在我的单例类中添加 28 个 @synchronized 块。
有没有更好的方法来解决我的问题?
或者,如果我确实使用了所有这些@synchronized 指令,会导致问题吗?
我知道如果我想让我的对象线程安全,它会减慢我的代码,但除此之外还有什么缺点吗?
【问题讨论】:
-
1) 如果你的单例是线程安全的,那么你可能不需要担心它的数据成员,在你的情况下是 NSMutableArray。 2) 您一定听说过并使用过数据成员的atomic/nonatomic 属性。前者使它们线程安全。为了额外的安全性,你可以声明你的 NSMutableArrays 是原子的。
-
另一种方法是为每个数组创建一个串行调度队列。然后,您可以在数组更新方法中将数组更新同步分派到相关队列中。 @Adeel,使 NSMutable 数组属性原子化不会使底层数组线程安全,只会使属性本身。
-
@Adeel:对可变对象类型的属性使用 atomic 属性绝对没有来同步突变。它不会使它成为“线程安全的”。它只做一件事和一件事:它确保 getter 和 setter 不会被中断。之后对象会发生什么不受控制。
-
@Adeel ,如何制作一个完美的线程安全单例类?我刚刚用调度一次守卫进行了初始化。并尝试在我访问 MutableArrays 的关键部分添加同步。而且我也不认为使用原子属性使我的数组线程安全。
标签: ios objective-c multithreading thread-safety synchronized