常見鎖代碼
多線程場景不可避免需要使用鎖來解決數(shù)據(jù)競爭大咱、并發(fā)訪問等問題礁竞,iOS 開發(fā)中恢氯,你會接觸到各種各樣的鎖涎嚼,不同的鎖有不同的使用場景和性能差異阱州。這里記錄下各種鎖及其使用方法,方便的大家查詢使用法梯。
自旋鎖
// 自旋鎖苔货,性能最高,但已被證明不再安全
{
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];
}
}
其它
// 普通鎖,性能最差
{
NSObject *lock = [NSObject new];
for (int i = 0; i < count; i++) {
@synchronized(lock) {
// 待加鎖的代碼
}
}
}