在可变数组访问上普遍使用@synchronized 指令的替代方法

Alternatives to pervasive use of the @synchronized directive on mutable array access

我正在 Objective-C 中设计一个单例 class,它将被多个线程访问。在我的 class 中有 3-4 个 NSMutableArray,在 class 之外可以访问 读取、添加和删除 操作,这当然是包装的在此 class。

由于 NSMutableArray 不是线程安全的,我使用 @synchronized() 使我的操作线程安全,但是它会导致 @synchronized() 块的使用过多。

因为对于 3-4 个数组,我至少有 1 个添加函数、1 个删除函数和 5 次我需要读取值。因此,对于 1 个数组,我使用了至少 7 个 @synchronized() 块。 对于 4 个数组,我需要在我的单例 class.

中添加 28 @synchronized 个块

有没有更好的方法来解决我的问题? 或者,如果我确实使用了所有这些 @synchronized 指令,它会导致问题吗?

我知道如果我想让我的对象线程安全,它会减慢我的代码,但除此之外还有什么缺点吗?

通常 仅同步原始调用 (CRUD) 以获得线程安全是不够的。这个精细的粒度级别只是基本级别,但您还必须考虑更全局的级别和 "atomize" 更大量的代码。如何做到这一点在很大程度上取决于您的实际实施。多线程是邪恶的(tm)并且需要一个全面的观点,所以对此没有通用的答案。

同步块通常会减慢您的应用程序,至少如果它们被过于频繁地调用。有时最好将多个调用组合在一个同步块中,以避免锁定开销。或者,如果调用非常短,您可以使用自旋锁来防止不必要的任务暂停(参见 here for an old question/answer)。

详情请参考Apple documentation