首页 > 代码库 > 多线程

多线程

(一)同步/异步

  (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,尽量避免多线程抢夺资源。

         其实开发中,前端只需读取,发送操作交互服务器。加锁任务都是服务端处理。

 

多线程