美文网首页
iOS 中automic属性关键字使用的是什么锁?

iOS 中automic属性关键字使用的是什么锁?

作者: Sweet丶 | 来源:发表于2020-08-17 18:43 被阅读0次

声明属性时使用automic,系统究竟是使用的哪个锁?
查看OC源码如下:源码

id objc_getProperty(id self, SEL _cmd, ptrdiff_t offset, BOOL atomic) {
    if (offset == 0) {
        return object_getClass(self);
    }

    // Retain release world
    id *slot = (id*) ((char*)self + offset);
    if (!atomic) return *slot;
        
    // Atomic retain release world
    spinlock_t& slotlock = PropertyLocks[slot];
    slotlock.lock();
    id value = objc_retain(*slot);
    slotlock.unlock();
    
    // for performance, we (safely) issue the autorelease OUTSIDE of the spinlock.
    return objc_autoreleaseReturnValue(value);
}

可以看到, 对于automic,系统加的锁是spinlock_t, 咋一看是自旋锁,但是进一步查看源码:

using spinlock_t = mutex_tt<DEBUG>;
// 也就是说spinlock_t就是mutex_tt,而mutex_tt是一个类,如下:

class mutex_tt : nocopy_t {
    os_unfair_lock mLock;
 public:
    mutex_tt() : mLock(OS_UNFAIR_LOCK_INIT) { }

.....
}

由上可知是os_unfair_lock, 但是os_unfair_lock是iOS 10之后才有的锁,所以我认为这是iOS 10以后做的优化,原先使用的就是自旋锁,这点也可以通过运行iOS 9的设备,通过运行时的汇编代码可以看到确实是自旋锁OSSpinLock

由此推断是iOS 10之前automic是用的自旋锁, iOS 10之后使用的是os_unfair_lock,这是一把互斥锁!(因为自旋锁会导致优先级反转问题)

相关文章

  • iOS 中automic属性关键字使用的是什么锁?

    声明属性时使用automic,系统究竟是使用的哪个锁?查看OC源码如下:源码 可以看到, 对于automic,系统...

  • 4.多线程

    锁 ios当中有哪些锁? @synchronized一般在创建单例对象的时候使用 atomic修饰属性的关键字对被...

  • iOS学习之一(变量)

    关于ios中成员变量、属性变量,以及@public、@protected、@private等关键字的使用。 成员变...

  • iOS属性关键字

    iOS属性关键字 引言 学习 iOS 开发的人,大多都绕不开属性关键字—— assign,weak,unsafe_...

  • iOS面试题<四>

    1.iOS线程并发需要注意什么? 2.iOS线程安全怎么处理 @synchronized 关键字构建的锁 :使用互...

  • 多线程中的锁

    ios中锁的种类 NSLock synchronized 关键字 pthread_mutex_t dispatch...

  • iOS中的修饰关键字

    1. iOS中定义属性、变量的修饰关键字 在声明@property 属性、变量时,总是要在括号中写上assign、...

  • 面试官:从源码角度讲讲ReentrantLock及队列同步器(A

    JDK 中独占锁(排他锁)的实现除了使用关键字 synchronized 外,还可以使用ReentrantLock...

  • Automic 原子属性

    给属性加上atomic 修饰 可以保证属性的setter 和 getter 都是原子性操作,也就是保证setter...

  • OC--各种线程锁

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

网友评论

      本文标题:iOS 中automic属性关键字使用的是什么锁?

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