ios多线程访问单例的安全性怎么考虑

ios多线程访问单例的安全性怎么考虑,第1张

- (instancetype)init {
dispatch_once_t once;
dispatch_once(&once, ^{
my = [[My alloc] init];
});
return my;
}
dispatch_once(&once, ^{ });此方法是c语言的方法,其中处理了线程问题

在iOS中使用多线程是为了让我们的页面不卡,提高用户体验。多线程实现的几种方法如下。

NSThread。这是最轻量级的多线程的方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的生命周期,线程同步。经常使用NSThread进行调试,在实际项目中不推荐使用。

GCD(Grand Central Dispatch),GCD是基于C语言底层API实现的一套多线程并发机制,非常的灵活方便,在实际的开发中使用很广泛。简单来说CGD就是把 *** 作 放在 队列 中去执行。

NSOperation & NSOperationQueue,虽然GCD的功能已经很强大了,但是它使用的API依然是C语言的。在某些时候,在面向对象的objective-c中使用起来非常的不方便和不安全。所以苹果公司把GCD中的 *** 作抽象成NSOperation对象,把队列抽象成NSOperationQueue对象。

OC面试题目合集地址

基本的锁: 自旋锁 、 互斥锁 、 读写锁 ,其他的比如 条件锁 、 递归锁 、 信号量 都是上层的封装和实现。


锁的性能从高到底依次是:

OSSpinLock(自旋锁) >
dispatch_semaphone(信号量) >
pthread_mutex(互斥锁)>
NSLock(互斥锁)>
NSCondition(条件锁) >
pthread_mutex(recursive 互斥递归锁)>
NSRecursiveLock(递归锁)>
NSConditionLock(条件锁)>
synchronized(互斥锁)


会发生 死锁

使用NSLock对临界区进行加锁, 进入方法2, 方法2里面对同一把锁又进行了lock方法, 这种情况会由于重入原因发生 死锁

用递归锁解决, 利用其重入特性: 一个线程可以加N次锁而不会引发死锁


dispatch_semaphore_t 的关键3个方法

所以看出信号量一般处理 加锁(互斥) , 异步返回 , 控制线程并发数 这些场景。


重点考察多线程并发安全这一情况, 下面例子都以总20张票, 卖10张, 模拟一下:

可看出数据其实是错乱的

那么我们肯定是要加互斥锁, 来保证线程安全, 如下

可看出数据正常, 方法没问题是可以的。

这里再提供另外一个解法, 信号量 处理。 信号量 优势看下 问题2 锁的性能 , 其中有 dispatch_semaphone(信号量) > NSLock(互斥锁) 。 并且因为这道题数据量比较小, 如果复杂同步 *** 作, 还是用 信号量 好一些, 那么我们用 信号量 保证下线程安全

1 Thread
2 Cocoa operations
3 Grand Central Dispatch (GCD)
Thread 轻量级 最复杂 你需要自己管理thread的生命周期,线程之间的同步。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread:
Cocoa threads: 使用NSThread 或直接从 NSObject 的类方法 performSelectorInBackground:withObject: 来创建一个线程。如果你选择thread来实现多线程,那么 NSThread 就是官方推荐优先选用的方式。
POSIX threads: 基于 C 语言的一个多线程库,
Cocoa operations是基于 Obective-C实现的,类 NSOperation 以面向对象的方式封装了用户需要执行的 *** 作,我们只要聚焦于我们需要做的事情,而不必太 *** 心线程的管理,同步等事情,因为NSOperation已经为我们封装了这些事情。 NSOperation 是一个抽象基类,我们必须使用它的子类。iOS 提供了两种默认实现:NSInvocationOperation 和 NSBlockOperation。
Grand Central Dispatch (GCD): iOS4 才开始支持,它提供了一些新的特性,以及运行库来支持多核并行编程,它的关注点更高:如何在多个 cpu 上提升效率。

进入软件的设置里,就可看到多线程设置的相关选项。
苹果处理器不同于安卓阵营,它的处理器没有那么多的“核”,没有多线程模式的太多设置选项,也没有开关按钮,系统默认直接开启(所以无法关闭),目前只有iphone7/7 Plus、iphone8/8 Plus和iphone X这些高性能机型开了多线程,其他机型都没开。
希望我的解答能够帮助您。

在之前的章节中,我们详细探究了多线程的相关概念、常用的实现方式(NSThread、GCD、NSOpreation),不常用的方式pThread。那么,iOS中,还有没有别的方式实现多线程呢?嘿嘿···你别说,还真有呢。

相关链接:
pThread链接: iOS详解多线程(实现篇——pThread)
NSOpreation链接: iOS详解多线程(实现篇——NSOperation)
GCD链接: iOS详解多线程(实现篇——GCD)
NSThread链接: 详解多线程(实现篇——NSThread)
多线程概念篇链接: 详解多线程(概念篇——进程、线程以及多线程原理)

源码链接: >

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13257344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-27
下一篇 2023-06-27

发表评论

登录后才能评论

评论列表(0条)

保存