谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? 一般开发中你最常用哪个? 哪个锁apple存在问题又是什么问题?
iOS开发中11种锁以及性能对比
Data race: 当至少有两个线程同时访问一个变量, 至少有一个是写操作时, 就发生Data race
例: 两个线程同时执行counter++ 产生数据竟跑, 造成的最终值为1
- load [%counter], rax; // 线程1从counter读取0到寄存器rax
- add rax, 1; // 线程1对寄存器rax进行加1
- load [%counter], rbx; // 线程2从counter读取0到寄存器rbx
- store rax [%counter]; // 线程1把1写入counter的主存地址
- add rbx, 1; // 线程2对寄存器rbx进行加1
- store rbx, [%counter]; // 线程2把1写入counter的主存地址
@synchronized表现最差
概念
1.临界区: 一块对公共资源进行访问的代码
2.自旋锁: 自旋锁不会引起调用者睡眠, 如果自旋锁已经被别的执行单元保持, 调用者就会循环在那里看是否该自旋锁的保持者已经释放了锁
3.互斥锁: 保证共享数据操作的完整性, 每个对象都可以对应一个可称为'互斥锁'的标记, 这个标记用来保证任一时刻, 只能有一个线程访问对象
4.读写锁: 读写锁实际是一种特殊的自旋锁, 它对共享资源的访问者划分成读者和写者, 一个读写锁同时只能有一个写者或多个读者,但不能既有读者又有写者
5.信号量:是一种更高级的同步机制
6. 条件锁:条件变量, 当进程的某些资源不满足时就进入休眠, 也就是锁住了
互斥锁
NSLock: NSLock在AFNetworking中有使用
pthread_mutex:在YYKit中可以看到
@synchronized:在AFNetworking中有使用
自旋锁
OSSpinLock: 大家已经不再使用它了, 在一些场景下已经不安全了
os_unfair_lock: 苹果官方推荐替换OSSpinLock的方案
读写锁
pthread_rwlock
递归锁
递归锁有一个特点, 同一个线程可以加锁N次而不会引发死锁
NSRecursiveLock
pthread_mutex(recursive)
条件锁
NSCondition
NSConditionLock
信号量
dispatch_semaphore