谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? 一般开发中你最常用哪个? 哪个锁apple存在问题又是什么问题?


iOS开发中11种锁以及性能对比

Data race: 当至少有两个线程同时访问一个变量, 至少有一个是写操作时, 就发生Data race

例: 两个线程同时执行counter++ 产生数据竟跑, 造成的最终值为1

  1. load [%counter], rax; // 线程1从counter读取0到寄存器rax  
  2. add rax, 1; // 线程1对寄存器rax进行加1  
  3. load [%counter], rbx; // 线程2从counter读取0到寄存器rbx  
  4. store rax [%counter]; // 线程1把1写入counter的主存地址  
  5. add rbx, 1; // 线程2对寄存器rbx进行加1  
  6. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值