多线程编程可以充分利用多核CPU的性能,提供资源的利用率能够提高程序的运行效率,使程序响应更快。但同时也带来了一些弊端:资源的竞争,死锁等。多线程编程中,应该尽量避免资源在线程之间共享,以减少线程间的相互作用。 但是总是有多个线程相互干扰的情况(如多个线程访问一个资源)。在线程必须交互的情况下,就需要一些同步工具,来确保当它们交互的时候是安全的。
锁是线程编程同步工具的基础。iOS开发中常用的锁有如下几种:
@synchronized
NSLock 对象锁
NSRecursiveLock 递归锁
NSConditionLock 条件锁
pthread_mutex 互斥锁(C语言)
dispatch_semaphore 信号量实现加锁(GCD)
OSSpinLock
@synchronized 关键字加锁 互斥锁,性能较差不推荐使用**
** NSLock 互斥锁 不能多次调用 lock方法,会造成死锁**
在Cocoa程序中NSLock中实现了一个简单的互斥锁。
所有锁(包括NSLock)的接口实际上都是通过NSLocking协议定义的,它定义了lock和unlock方法。你使用这些方法来获取和释放该锁。
NSLock类还增加了tryLock和lockBeforeDate:方法。
tryLock试图获取一个锁,但是如果锁不可用的时候,它不会阻塞线程,相反,它只是返回NO。
lockBeforeDate:方法试图获取一个锁,但是如果锁没有在规定的时间内被获得,它会让线程从阻塞状态变为非阻塞状态(或者返回NO)。
dispatch_semaphore 信号量实现加锁
GCD中也已经提供了一种信号机制,使用它我们也可以来构建一把”锁”