iOS多线程简述

基本概念

  1. 进程:是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
  2. 线程:线程是进程的基本执行单元
  3. 进程和线程比较

    1.线程是CPU调用(执行任务)的最小单位。
    2.进程是CPU分配资源和调度的单位。
    3.一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。
    4.同一个进程内的线程共享进程的资源。

  4. 多线程:即1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。

  5. 多线程的并行

    • 原理:多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
    • 优点:①能适当提高程序的执行效率;②能适当提高资源利用率(CPU、内存利用率)
    • 缺点:①开启线程需要占用一定的内存空间,如果开启大量的线程,会占用大量的内存空间,降低程序的性能;②线程越多,CPU在调度线程上的开销就越大;③程序设计更加复杂:比如线程之间的通信、多线程的数据共享
  6. iOS开发中多线程

    • 主线程: 一个iOS程序运行后,默认会开启1条线程,称为“主线程”或“UI线程”;主要作用是:①刷新和显示UI,②处理UI事件
    • 子线程:除了主线程之外的所有线程,也叫做后台线程,`
    • 注意:①不要将耗时操作放到主线程中去处理,会卡住线程;②和UI相关的刷新操作必须放到主线程中进行处理;
  7. iOS开发中多线程

    • pthread
    • NSThread
    • GCD
    • NSOperation

    四种技术方案的比较:

技术方案 简介 语言 生命周期 使用频率
pthread 一套通用的多线程API,适用于Unix\Linux\Windows等系统,跨平台\可移植,使用难度大. C 程序员管理 几乎不用
NSThread 使用更加面向对象,简单易用,可直接操作线程对象. OC 程序员管理 偶尔使用
GCD 旨在替代NSThread等线程技术,充分利用设备的多核. C 自动管理 经常使用
NSOperation 基于GCD(底层是GCD),比GCD多了一些更简单实用的功能,使用更加面向对象. OC 自动管理 经常使用

线程状态

线程的状态有:创建,就绪,运行,阻塞,死亡,具体过程由下图所示:
线程状态

  • 创建线程后,当调用start方法时就会进入可调度线程池进入就绪状态,
  • 如果CPU现在调度当前线程对象,则当前线程对象进入运行状态,如果CPU调度其他线程对象,则当前线程对象回到就绪状态。
  • 如果CPU在运行当前线程对象的时候调用了sleep方法\等待同步锁,则当前线程对象就进入了阻塞状态,等到sleep到时\得到同步锁,则回到就绪状态。
  • 如果CPU在运行当前线程对象的时候线程任务执行完毕\异常强制退出,则当前线程对象进入死亡状态。

多线程的安全隐患

一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象、同一个变量、同一个文件,当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题.
这里写图片描述

安全隐患解决

互斥锁

互斥锁使用格式:
@synchronized(锁对象) { // 需要锁定的代码 }
注意:锁定1份代码只用1把锁,用多把锁是无效的
互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
互斥锁的使用前提:多条线程抢夺同一块资源
安全隐患解决(互斥锁)

原子和非原子属性

OC在定义属性时有nonatomicatomic两种选择
atomic:原子属性,为setter方法加锁(默认就是atomic
nonatomic:非原子属性,不会为setter方法加锁
nonatomicatomic对比
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备
iOS开发的建议
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

线程间通信

什么叫做线程间通信
在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信
线程间通信的体现
1个线程传递数据给另1个线程
在1个线程中执行完特定任务后,转到另1个线程继续执行任务
线程间通信常用方法(NSObject)

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

面试相关:
iOS 网络和多线程面试题01~有答案
iOS进阶面试题—-多线程


iOS多线程相关文章:
iOS多线程简述
iOS多线程-pthread、NSThread
iOS多线程-GCD
iOS多线程-NSOperation, NSOperationQueue
iOS多线程-RunLoop
OC单例模式详解

猜你喜欢

转载自blog.csdn.net/bolted_snail/article/details/79261779