







































1、你理解的多线程(什么是多线程、多线程的原理、多线程的优缺点)?
首先多线程就是在一个进程里面开启了多条线程同时执行任务。但是多线程只是一个假象,同一时间CPU只能处理1条线程,多线程并发其实就是CPU快速的在多条线程之间切换,给人的感觉好像是多条线程同时执行任务。
-
优点:
1、防止线程阻塞、增加运行效率
2、提高资源利用率(CPU、内存利用率) -
缺点:
1、占空间(默认情况下,主线程占用1M,子线程占用512KB)、花时间(创建线程大约需要90毫秒的创建时间)
2、如果开启大量的线程,会降低程序的性能(消耗大量的CPU资源,CPU会在N多条线程之间调度,每条线程被调度执行的频次会降低),(建议3-5条线程,推荐3条)
3、程序设计复杂(线程之间的通信、多线程的数据共享)
2、iOS的多线程方案有哪几种?你更倾向于哪一种?

3、你在项目中用过GCD吗,都在哪里用的?
1)GCD一次性代码dispatch_once
2)GCD延迟函数dispatch_after
3)GCD快速迭代dispatch_apply(没用过)
4)GCD栅栏函数dispatch_barrier_async(没用过)
5)队列组
6)定时器
7)多线程(想想)
4、说一下NSOperation和GCD的区别?以及各自的优势?
1)GCD是纯C语言API,而操作队列是OC的对象;
2)GCD中任务用block块来表示,而块是个轻量级的数据结构;NSOperation则是个更加重量级的OC对象;
3)具体该使用GCD还是使用NSOperation需要看具体的情况;
NSOperation和NSOperationQueue的好处有:
1)NSOperationQueue可以挂起(暂停/恢复)和取消某个操作,而GCD中的任务是无法被取消的(安排好任务之后就不管了)。
2)NSOperation可以通过KVO提供对NSOperation对象的精细控制(如监听当前操作是否正在执行、是否被取消、是否已经完成等)。
3)NSOperation可以方便的指定操作间的依赖关系。
4)NSOperation可以方便的指定操作间的优先级(操做优先级表示此操做与队列中其它操作之间的优先关系,优先级高的操作先执行,优先级低的操作后执行)。
5)通过自定义NSOperation的子类可以实现操做重用。
5、线程安全处理的手段有哪些?
-
1、OSSpinLock:
叫做“自旋锁”,等待锁的线程会处于忙等状态,一直占用着CPU资源;
目前已经不再安全,可能会出现优先级反转问题; -
2、os_unfair_lock:
用于取代不安全的OSSpinLock,从iOS10开始支持,等待锁的线程处于休眠状态; -
3、Pthread_mutex:
互斥锁,等待锁的线程会处于休眠状态; -
4、NSLock:
是对mutex普通锁的封装; -
5、NSRecursiveLock:
是对mutex递归锁的封装; -
6、NSCondition:
是对mutex的条件的封装; -
7、NSConditionLock:
是对NSCondition的进一步封装,可以设置具体的条件值; -
8、dispatch_queue:
直接使用GCD的串行队列,也是可以实现线程同步的; -
9、dispatch_semaphore:
semaphore叫做“信号量”,信号量的初始值可以用来控制线程并发访问的最大数量;信号量的初始值为1,代表同时只允许1条线程访问资源,保证线程同步; -
10、@synchronized:
是对mutex递归锁的封装;
@synchronized(obj)内部会生成obj对应的递归锁,然后进行加锁解锁操做;
注意:性能排序前四名
第一:os_unfair_lock(iOS10推出低版本不支持)
第二:OSSpinLock(存在优先级反转问题)
第三:dispatch_semaphore
第四:pthread_mutex
6、atomic关键字?
- atomic保证了属性setter、getter的原子性操作,相当于setter和getter内部加了线程同步的锁。
- 它并不能保证使用属性的过程是线程安全的。
7、多线程的读写安全?
- 1、pthread_rwlock:读写锁
- 2、dispatch_barrier_async:异步栅栏调用
网友评论