什么是进程?进程是指系统中正在运行的一个应用程序。
每个进程之间是独立的,每个进程都运行在其专用并受保护的内存空间内。
什么是线程?线程是进程的基本执行单元。一个进程想要执行任务必须得有线程。(一个进程最少得有一个线程)
一个线程中任务的执行是串行的。
什么是多线程?一个进程中可以开启多条线程,每条线程可以并发(同时)执行不同的任务。
多线程技术可以提高程序的执行效率。
多线程原理:一个CPU同一时间只能处理一条线程,多线程并发执行,其实是CPU快速的(纳秒级)在多条线程之间调度(切换)。
多线程优点:提高程序执行效率和资源利用率。
多线程缺点:开启大量的线程会占用大量的内存(一条512KB),还会使程序设计更加复杂。
主线程:一个IOS程序运行后,会默认开启一条线程(主线程)。
主要作用:显示/刷新UI界面,处理事件。
切勿将比较耗时的操作放到主线程中,会给用户一种卡的感觉。
一:基本使用
1,如何创建NSThread?
一个NSThread对象就代表一条线程。
(1)alloc init
(2)detachNewThreadSelector 会立即在后台线程执行selector方法
(3)performSelectorInBackground隐式的多线程方法
2,如何获取当前线程?
二:线程状态
1,启动线程 start
2,阻塞线程
3,停止线程
在内存中销毁。
4,NSThread的属性及优先级的设定
两个属性:name(线程名),
threadPriority(优先级:0~1.0,1代表优先级最高)
三:资源抢夺
1,多线程的安全隐患问题:
当多个线程可以访问同一资源,很容易引发数据错乱和数据安全问题
如何解决:
互斥锁 @synchronized (锁对象) { //需要锁定的代码 }
锁对象一定要是多个线程能共享的对象,大多都用self;
互斥锁优点:能有效解决因多线程同时抢夺同一资源而产生的安全问题。
互斥锁缺点:需要消耗大量CPU资源。
2,原子和非原子属性 atomic / nonatomic
nonatomic:非原子属性
atomic:原子属性(线程安全),针对多线程设计的,是默认属性。当多个线程写入属性时,保证同一时间只有一个线程执行操作。
实际上,原子属性内部也有一把锁,自旋锁
自旋锁& 互斥锁
-共同点
都能够保证同一时间,只有一条线程执行锁定范围的代码
-不同点
互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入休眠状态,等待其他线程执行完毕,打开锁之后,线程会被唤醒
自旋锁:如果发现有其他线程正在执行锁定的代码,线程会用死循环的方式,一直等待锁定代码执行完成!
自旋锁更适合执行非常短的代码!
自旋锁& 互斥锁
-共同点
都能够保证同一时间,只有一条线程执行锁定范围的代码
-不同点
互斥锁:如果发现有其他线程正在执行锁定的代码,线程会进入休眠状态,等待其他线程执行完毕,打开锁之后,线程会被唤醒
自旋锁:如果发现有其他线程正在执行锁定的代码,线程会用死循环的方式,一直等待锁定代码执行完成!
自旋锁更适合执行非常短的代码!
-无论什么锁,都是要付出代价的!
四,加载网络图片
线程间通讯:
PS:定时器若干
*********************weak在ARC/MRC***********************
MRC的内存分配原则:谁申请,谁释放
ARC :在执行的时候,自动添加 retain/release/autorelease
在ARC中,拥有weak属性,如果没有被其他对象强引用,会被立即销毁。
在MRC中,不允许使用weak,应该使用assign。