iOS刨根问底栏目组

iOS多线程详解(一)--- 多线程基础

2017-03-17  本文已影响76人  WQ_UESTC

前言

最近想系统的研究下iOS上的多线程,就搜集了大量的资料,在这些资料的基础之上形成了这篇文章。一方面希望自己加深下印象,另外一方面也希望对他人提供一些帮助。由于本人水平有限,难免出现错误和疏漏之处,还请读者见谅。本篇文章主要参考了李明杰老师的教程和一些优秀的文章,再此深表感谢。

1、基本概念

2、线程的状态与生命周期

下图是线程状态示意图,从图中可以看出线程的生命周期是:新建-就绪-运行-阻塞-死亡


线程状态.png

下面分别阐述线程生命周期中的每一步

3、多线程的原理

在同一时间内,(单核)CPU只能处理1条线程,只有1条线程在工作(执行)。因此,多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。
思考:如果线程非常非常多,会发生什么情况?
1、CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
2、每条线程被调度执行的频次会降低(线程的执行效率降低)

4、多线程的优缺点

5、多线程在iOS开发中的应用

6、多线程的四种解决方案

多线程的四种解决方案分别是:pthread,NSThread,GCD,NSOperation。
下图给出了这四种方案的解读和对比。


多线程的四种解决方案.png

7、线程安全问题

当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。就好比几个人在同一时修改同一个表格,造成数据的错乱。

解决多线程安全问题的方法

@synchronized(锁对象) {
    // 需要锁定的代码
}

判断的时候锁对象要存在,如果代码中只有一个地方需要加锁,大多都使用self作为锁对象么这样可以避免单独再创建一个锁对象。
加了互斥锁的代码,当新的线程访问时,如果发现其他线程正在执行锁定的代码,新线程就会进入休眠。

nonatomic 非原子属性,同一时间可以有很多线程读和写
atomic 原子属性(线程安全),保证同一时间只有一个线程能够写入(但是同一个时间多个线程都可以取值),atomic 本身就有一把锁(自旋锁)
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,不过效率更高,一般使用nonatomic

8、小结

本节主要介绍了多线程的基础知识,从下节开始介绍iOS多线程的具体使用。

相关系列文章

iOS多线程详解(一)--- 多线程基础
iOS多线程详解(二)--- pthread&NSThread
iOS多线程详解(三)--- GCD
iOS多线程详解(四)--- NSOperation
iOS多线程详解(五)--- 线程安全(锁的创建)
iOS多线程详解(六)--- 线程安全(Property)

参考资料:

1、李明杰老师的iOS视频教程
2、http://www.cocoachina.com/ios/20170707/19769.html

上一篇下一篇

猜你喜欢

热点阅读