声明属性时使用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
,这是一把互斥锁!(因为自旋锁会导致优先级反转问题)
网友评论