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

声明属性时使用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;
// 也就是说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属性关键字使用的是什么锁?)