OSSpinlock 、 pthread_mutex 、 NSLock+IMP 、 NSLock 、 @synchronized 1、OSSpinlock 使用 static OSSpinLock aspect_lock = OS_SPINLOCK_INIT; OSSpinLockLock(&aspect_lock); //要执行的操作 OSSpinLockUnlock(&aspect_lock); 2、pthread_mutex使用 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); 3、NSLock使用 NSLock *lock = [NSLock new]; [lock lock]; [lock unlock]; 4、NSLock+IMP NSLock lock = [NSLock new]; [lock lock]; [lock unlock]; typedef id(_IMP) (id, SEL, ...); _IMP lockLock = (_IMP)[lock methodForSelector:@selector(lock)]; _IMP unlockLock = (_IMP)[lock methodForSelector:@selector(unlock)]; lockLock(lock,@selector(lock)); unlockLock(lock,@selector(unlock)); 5、synchronized id obj = [NSObject new]; @synchronized(obj){
} 耗时结果比较: OSSpinlock < pthread_mutex < NSLock+IMP < NSLock < @synchronized 1、@synchronized 内部会创建一个异常捕获的handler和其他内部使用的锁。所以会消耗大量的时间
2、NSLock 和 NSLock+IMP 两个时间非常接近。他们是 pthread mutexes 封装的,但是创建对象的时候需要额外的开销。
3、pthread_mutex 底层的API,性能比较高。
4、OSSpinLock 自旋锁不进入内核,仅仅是重新加载。如果自旋锁占用的时间是极少的(通常是纳秒级别的)性能还是比较高的,减少了系统的直接调用和上下文的切换。
但是,如果有资源竞争的时候,会占用更多的cpu,耗电严重。这个时候,使用 pthread_mutex 可以避免电量的消耗,虽然耗时多一些。