进程和线程概念
1,进程:进程是计算机系统分配的单位,每个进程之间是相互独立的,如同时打开微信,QQ,那么就开启了2个进程;
2,线程:线程是进程的基本执行单位,进程中所有的任务都是在线程中执行的,每一个进程都必须存在并且只有一个主线程,允许存在多个子线程;
3,多线程:在不阻塞主线程情况下,充分利用CPU资源开启多个线程去执行耗时任务,优化app体验;
NSThread使用
异步,并发队列
需要对线程进行手动管理
较少用到
创建
第一种是类方法:
1 | [NSThread detachNewThreadSelector:@selector(action4) toTarget:self withObject:@"123"]; |
该类方法创建的线程会自动启动,@”123”是线程的标识符;
iOS10之后提供了一种Block方法:
1 | [NSThread detachNewThreadWithBlock:^{ |
第二种是init方法:
1 | NSThread *t1 = [[NSThread alloc]initWithTarget:self selector:@selector(action1) object:nil]; |
需要手动去开启,name=@“1”是线程的标识符;
NSThread一些方法和属性
1 | //是否是多线程 |
线程同步
线程同步,指的是不同的线程同时去争夺同一块资源,造成的数据混乱和数据安全的问题;就好比几个人修改同一个表的时候造成的数据混乱;
解决方案1:@synchronized
1 | @synchronized(self) { |
解决方案2:NSLock
1 | 全局变量:NSLock *lock = [[NSLock alloc]init]; |
互斥锁和自旋锁
互斥锁
上面的方案1和方案2都属于互斥锁:加了互斥锁的代码,当新线程访问时,如果发现其他线程正在执行锁定的代码,新线程就会进入休眠.
自旋锁
另外还有一种叫自旋锁:加了自旋锁,当新线程访问代码时,如果发现有其他线程正在锁定代码,新线程会用死循环的方式,一直等待锁定的代码执行完成。相当于不停尝试执行代码,比较消耗性能。
属性修饰atomic本身就有一把自旋锁。
1 | nonatomic 非原子属性,同一时间可以有很多线程读和写 |