(一)同步/异步
(1)同步:代码依次顺序执行。
(2)异步:
(二)进程/线程
(1)进程:正在运行的应用程序。每个进程之间是独立的,内存受保护,不能随意互相访问。
(2)线程:是进程的基本执行单元,一个进程的所有任务都在线程中完成,一个进程有多个线程。
一个进程可以有多个线程,多个线程同时执行不同任务,那么就是多线程。
(三)多线程执行原理
干活的是CPU。单核cpu同一时间只能处理一个线程。多线程其实就是CPU快速的在多个线程间切换,如果切换的速度很快,就仿佛变成了多线程多个任务同时执行的假象。其实说白了就是任务还是依次执行的,假如执行吃饭和睡觉。只是吃一口,再去睡一下,再吃一口,睡一下,频繁调度罢了。如果线程数很多,频繁切换,效率就会变低!
(四)多线程优缺点
优点:提高程序效率,CPU利用率。
线程上任务执行完毕后,线程会自动从内存中销毁(节约内存)。
缺点:开辟线程占512K。
开多了降低性能,并且让程序更加复杂。
(五)主线程:也就是app默认开启的线程,也是UI线程,用来处理UI问题(各种点击事件,刷新)
注:千万不要把耗时操作放到主线程,会卡,影响流畅度。
(六)iOS多线程技术方案
(1)pthread:跨平台,C语言。
(2)NSThread:OC封装。用的多的也就是currentThreat看一下线程。
(3)GCD:自动管理线程生命周期,很常用。
(4)NSOperation:基于GCD,面向对象。
(七)多线程访问共享资源问题:当多个线程访问相同一个对象/数据/文件的时候,容易出现数据错误。
解决:加锁,让某个线程在操作的时候,锁住线程某段代码,在代码执行完毕之前,让别的线程先无法访问。说白了就是如果线程代码加锁,在访问的那一刻,别人就无法访问了。当执行完毕才可以让别的线程访问。
(1)互斥锁:(只适用OC)@synchronized(self){需要锁定的代码},运用到了线程同步:多条线程按顺序的执行任务。每一个NSObject都有锁,默认是开启的。
(2)自旋锁:
atomic(原子属性,自旋锁):线程安全的,单写多读。读,是get方法。单写多读,就是给set方法加锁。然后同一时间,只允许一条线程访问,多个线程可以读取(看一看)。
nonatomic:线程不安全的。速度快。一般所有属性都会声明称nonatomic,尽量避免多线程抢夺资源。
其实开发中,前端只需读取,发送操作交互服务器。加锁任务都是服务端处理。