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

标签 ios objective-c multithreading thread-safety synchronized

我正在用 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/

相关文章:

c# - 如何使用BackgroundWorker在单独的线程中运行像 `object = ClassA.GetObject()`这样的任务?

c++ - 有什么方法可以让 Enter/LeaveCriticalSection 留下句柄

ios - 如何在 iOS 8 中判断目标界面的方向?

ios - 委托(delegate)是否仍然不安全未保留?

ios - iOS 12及以下版本如何使用SF Symbols?

objective-c - Objective-C 中的解引用是如何工作的

objective-c - 速记选择器调用

ios - 地理围栏 didEnterRegion,didExitRegion 函数不在 iphone 5S iOS8.1 中调用

objective-c - 如何不重置 NSDatePicker 中选定的日期(objective-c/cocoa)

c++ - 是否可以从其他线程隐藏 qt 小部件窗口?