自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分(对于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。
自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自旋锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。所以,此锁比较适用于锁的持有者保存时间较短的情况下。
部分代码如下:
以下代码要导入以下头文件
#import <libkern/OSAtomic.h>
#import <os/lock.h>
#import <AddressBook/AddressBook.h>
// 自旋锁
- (void)OSSpinLock {
// spinLock = OS_SPINLOCK_INIT;
// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// NSLog(@"线程1 准备上锁");
// OSSpinLockLock(&spinLock);
// sleep(4);
// NSLog(@"线程1");
// OSSpinLockUnlock(&spinLock);
// NSLog(@"线程1 解锁成功");
// NSLog(@"----------------------------------");
//
// });
/*
// iOS 10以后用下面的 解决了优先级反转问题
// os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
// os_unfair_lock_lock(unfairLock);
// os_unfair_lock_unlock(unfairLock);
*/
os_unfair_lock_t unfairLock = &(OS_UNFAIR_LOCK_INIT);
NSLog(@"线程1 准备上锁");
os_unfair_lock_lock(unfairLock);
sleep(4);
NSLog(@"线程1");
os_unfair_lock_unlock(unfairLock);
NSLog(@"线程1 解锁成功");
NSLog(@"---------------------------------------");
}
YYKit 作者 @ibireme 的文章也有说这个自旋锁存在优先级反转问题,具体文章可以戳 不再安全的 OSSpinLock。