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