多线程场景不可避免需要使用锁来解决数据竞争、并发访问等问题,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!