一个iOS初学者对多线程的一点见解,都是概念上的一些理解,欢迎大家来围观
假如生活欺骗了你,不要悲伤,不要心急
因为,没什么卵用
以下正文
1 多线程的优势和劣势
在iOS开发中,至少有一条线程,即主线程,也可以叫UI线程
如果在程序运行期间有某一操作耗时较长,但这时只有一条线程,即UI线程,就会造成界面"卡顿",即在耗时操作运行期间,UI线程无法响应其他操作,例如,点击一个button,或者拖动slider,这样都是不可以的,只有当该耗时操作完成后才可以进行其他操作造成极差的用户体验
**这对苹果用户来说是及其难以接受的**
此时我们就可以开辟另外的线程来进行耗时操作,而不影响我们的界面运行,感觉上是多个任务同时执行,但这其实只是逻辑上的,而非物理上的
然而是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:
(1)耗时或大量占用处理器的任务阻塞用户界面操作;
(2)各个任务必须等待外部资源 (最明显的比如下载)。
(3)各个线程可以单独管理,迅雷的每个下载进程都可以暂停/继续
多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括:
(1)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如占用大量的内存,线程数目过多也会造成每个线程的调用率降低,比如迅雷的下载,如果同时下载10个电影,这样的话每个都很慢
(2)线程的死锁。即较长时间的等待或资源竞争。
(3)对公有变量的同时读或写。当多个线程需要对公有变量**同时**进行读写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是我们无法预知的。**这是一个巨大的隐患 但是这是可以通过加互斥锁来解决**。
@synchronized
2 原子性 atomic
原子性本身就是针对多线程设计的 它实现的功能是单(线程)写多(线程)读
大家一般声明属性的时候一般都用 nonatomic
但其实默认情况下是 atomic
**苹果并不推荐使用原子属性,因为会降低程序的运行速度**
当语义设置是atomic的时候默认的setter方法就是这样的
-(void)setObj:(NSObject *)obj
{
//原子性内部使用 自旋锁
@synchronized(self){
_obj = obj;
}
}
此时加的锁不是互斥锁,互斥锁的概念是write和read同时加锁,即setter和getter都加锁
自旋锁只给setter方法加锁,因为readwriter语义中,write的权限要求更高一点
3 线程安全
线程安全就是多个线程同时执行的时候,可以保证资源信息的准确性
4 UI线程 即主线程
UIKit 中绝大部分的类,都不是"线程安全"的
因为都是nonatomic
**苹果约定,所有UI的更新全部放进主线程中,也就不会出现多个线程改写同一个资源**
在主线程更新UI的好处
- 不会出现线程安全问题
- 主线程的优先级是最高的,UI的更新的优先级也高,会让用户感觉到很流畅,因为用户只能看到UI