iOS:线程锁

1. 什么是线程锁

线程锁主要是用来控制多个线程同时访问和修改,避免造成不可预期的问题。

2. 自旋锁和互斥锁

自旋锁:
一种用来保护多线程共享资源的锁,与互斥锁不同的是,当自旋锁尝试获取锁是否可用时,以忙等待进行循环检查锁是否可用。当上一个线程没有执行完毕时,下一个线程一直处于忙等待中,不能休眠。(简单理解为,轮询的方式检查锁是否可用。轮不到你时,你就一直等着,不准休息)

互斥锁:
当上一个锁没有执行完毕时,下一个锁会进入休眠状态。当上一个锁执行完毕后,下一个锁会自动唤醒然后执行任务。(简单理解:别人执行任务时,你先休息;别人完成了,你醒了干活)

总结:
自旋锁忙等待,所以不会进入休眠。如果执行不耗时的操作时,执行效率比互斥锁高。同时也是自身的缺点,如果执行耗时的操作,因为下一个线程一直处于忙等多种,所以 CPU 的使用效率就会比较低。

3. 常见的锁
  1. atomic:自旋锁
  2. @synchronized:互斥锁
  3. NSLock:互斥锁
  4. Dispatch_semaphore:自旋锁
  5. NSRecursiveLock:互斥锁
  6. OSSpinLock:互斥锁

注:
dispatch_semaphore_create:给信号量一个初始值,不能低于 0。
dispatch_semaphore_wait:让信号量 -1。如果信号量值等于 0 则开始循环等待。
dispatch_semaphore_single:让信号量+ 1

4. 线程死锁

线程死锁就是队列使用不当引起的线程循环等待。

常见的有

  1. 在主队列中使用同步:dispatch_sycn(dispatch_get_main_queue,^{})
  2. dispatch_semaphore 中没有及时发送信号。
posted @ 2023-04-21 13:46  dulinshun  阅读(113)  评论(0)    收藏  举报