对iOS开发多线程的一点见解

2016-05-22  本文已影响0人  有只小狗叫大黄

一个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

上一篇下一篇

猜你喜欢

热点阅读