在可变数组访问上普遍使用@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。
我正在 Objective-C 中设计一个单例 class,它将被多个线程访问。在我的 class 中有 3-4 个 NSMutableArray
,在 class 之外可以访问 读取、添加和删除 操作,这当然是包装的在此 class。
由于 NSMutableArray
不是线程安全的,我使用 @synchronized()
使我的操作线程安全,但是它会导致 @synchronized()
块的使用过多。
因为对于 3-4 个数组,我至少有 1 个添加函数、1 个删除函数和 5 次我需要读取值。因此,对于 1 个数组,我使用了至少 7 个 @synchronized()
块。
对于 4 个数组,我需要在我的单例 class.
@synchronized
个块
有没有更好的方法来解决我的问题?
或者,如果我确实使用了所有这些 @synchronized
指令,它会导致问题吗?
我知道如果我想让我的对象线程安全,它会减慢我的代码,但除此之外还有什么缺点吗?
通常 仅同步原始调用 (CRUD) 以获得线程安全是不够的。这个精细的粒度级别只是基本级别,但您还必须考虑更全局的级别和 "atomize" 更大量的代码。如何做到这一点在很大程度上取决于您的实际实施。多线程是邪恶的(tm)并且需要一个全面的观点,所以对此没有通用的答案。
同步块通常会减慢您的应用程序,至少如果它们被过于频繁地调用。有时最好将多个调用组合在一个同步块中,以避免锁定开销。或者,如果调用非常短,您可以使用自旋锁来防止不必要的任务暂停(参见 here for an old question/answer)。
详情请参考Apple documentation。