多线程场景不可避免需要使用锁来解决数据竞争、并发访问等问题,iOS 开发中,你会接触到各种各样的锁,不同的锁有不同的使用场景和性能差异。这里记录下各种锁及其使用方法,方便的大家查询使用。
自旋锁
// 自旋锁,性能最高,但已被证明不再安全 { OSSpinLock lock = OS_SPINLOCK_INIT; for (int i = 0; i < count; i++) { OSSpinLockLock(&lock); // 待加锁的代码 OSSpinLockUnlock(&lock); } }
信号量锁
// 信号量锁,性能较高 { dispatch_semaphore_t lock = dispatch_semaphore_create(1); for (int i = 0; i < count; i++) { dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER); // 待加锁的代码 dispatch_semaphore_signal(lock); } }
互斥锁
// 互斥锁,性能较高 { pthread_mutex_t lock; pthread_mutex_init(&lock, NULL); for (int i = 0; i < count; i++) { pthread_mutex_lock(&lock); // 待加锁的代码 pthread_mutex_unlock(&lock); } }
条件锁
// 条件锁 { NSCondition *lock = [NSCondition new]; for (int i = 0; i < count; i++) { [lock lock]; // 待加锁的代码 [lock unlock]; } }
普通锁
// 普通锁 { NSLock *lock = [NSLock new]; for (int i = 0; i < count; i++) { [lock lock]; // 待加锁的代码 [lock unlock]; } }
递归锁
// 递归锁 { NSRecursiveLock *lock = [NSRecursiveLock new]; for (int i = 0; i < count; i++) { [lock lock]; // 待加锁的代码 [lock unlock]; } }
条件锁
// 条件锁 { NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:1]; for (int i = 0; i < count; i++) { [lock lock]; // 待加锁的代码 [lock unlock]; } }
便利锁(自己YY的名)
// 普通锁,性能最差 { NSObject *lock = [NSObject new]; for (int i = 0; i < count; i++) { @synchronized(lock) { // 待加锁的代码 } } }
最后,Enjoy yourself!