美文网首页
iOS中的锁笔记

iOS中的锁笔记

作者: 会跑的鱼_09 | 来源:发表于2020-11-28 17:04 被阅读0次

本文只是我对iOS中锁的学习笔记,没有太深入的研究讲解。先来一张ios中常用锁的性能对照图


截屏2020-11-25 下午5.07.12.png

锁的分类

自旋锁:在未获取到锁的情况下,线程会反复检查锁变量是否可用,处于一直忙等状态,所以不会进行上下文切换,适用于阻塞很短时间的场景,常见的锁有OSSpinLock,另外atomic修饰符内部也是使用的自旋锁。

互斥锁:是一种用于多线程编程中,防止两条线程同时对同一公共资源(比 如全局变量)进行读写的机制。它可以将代码切片成一个一个的临界区以达到锁的目的。拿不到锁的线程会进入睡眠状态,等待其他线程释放锁后将其唤醒。NSLock、pthread_mutex、@synchronized都属于互斥锁。

OSSpinLock(自旋锁)

由于多线程优先级反转问题,可能导致优先级高的线程一直处于忙等状态,而优化级低的线程又拿不到锁,所以ios10开始已被os_unfair_lock取代。

dispatch_semaphore

一种比较高级的线程间同步机制,互斥锁可以说是semaphore在仅取值0/1时的特例。

pthread_mutex、NSLock、NSRecursiveLock

NSLock和NSRecursiveLock都是基于pthread_mutex互斥锁实现,但NSRecursiveLock支持递归调用。

NSCondition、NSConditionLock

其底层是使用的互斥锁,但在此基础上增加了线程间通讯的能力,通过相应的api可以控制线程的执行流程。

synchronized分析

被@synchronized包裹的代码块会被编译器转换成objc_sync_enter和objc_sync_exit,并且在加解锁时是操作的SyncData这个对象

typedef struct alignas(CacheLineSize) SyncData {
    struct SyncData* nextData;
    DisguisedPtr<objc_object> object;
    int32_t threadCount;  // number of THREADS using this block
    recursive_mutex_t mutex;
} SyncData;

SyncData存储在线程缓存中,是一个链表,主要用于针对不同对象加锁的情况。另外其中threadCount是用于多线程的场景,如果多个线程对同一个对象加锁,只会增加threadCount的值。如果是同一个线程对同一对象多次加锁,例如嵌套的情况,那么会操作线程缓存中的lockCount变量。

推荐学习:
iOS-底层原理 29:锁的原理

相关文章

  • iOS中的锁笔记

    本文只是我对iOS中锁的学习笔记,没有太深入的研究讲解。先来一张ios中常用锁的性能对照图 锁的分类 自旋锁:在未...

  • iOS中的锁 笔记

    会阻塞线程的锁,都属于互斥锁 NSLock NSLock的lock方法和lockBeforeDate: 方法会阻塞...

  • OC--各种线程锁

    参考:正确使用多线程同步锁@synchronized()iOS中的锁iOS多线程安全详解iOS 常见知识点(三):...

  • iOS中isEqual和Hash的笔记(一)

    iOS中isEqual和Hash的笔记(一) iOS中isEqual和Hash的笔记(一)

  • ios开发中的各种锁机制

    ios开发中的各种锁机制

  • iOS锁系列-目录

    1、 iOS锁系列-NSLock对象锁2、iOS锁系列-NSConditionLock条件锁3、iOS锁系列-NS...

  • iOS 中的锁(4)

    iOS 中的锁(4) 不想篇幅太长,再开一篇继续探究iOS中的锁。 注:本文主要通过Objective-C语言进行...

  • iOS 中的锁(2)

    iOS 中的锁(2) 不想篇幅太长,再开一篇继续探究iOS中的锁。 注:本文主要通过Objective-C语言进行...

  • iOS 中的锁(3)

    iOS 中的锁(3) 不想篇幅太长,再开一篇继续探究iOS中的锁。 注:本文主要通过Objective-C语言进行...

  • iOS开发中的锁

    iOS开发中的锁 本人对锁没有深入理解,只是看了几篇文章,在这里做一下简单的总结。 iOS开发中,锁是用来解决线程...

网友评论

      本文标题:iOS中的锁笔记

      本文链接:https://www.haomeiwen.com/subject/eeccwktx.html