- スピンロック
NSSpinLockが、それは欠陥がある、現在は廃止され、使用することはできません、それはデッドロックが発生します。優先度の低いスレッドがロックにアクセスして、タスクを実行するとき、それは高い優先度を持っているので、それからだけで優先度の高いスレッドもロックを訪問し、その優先度のタスクは、それがロックへのアクセスを停止することはありませんので、低優先度のスレッドで、その結果、など、忙しいロックにアクセスするために使用されるCPUのほとんどは、タスクを実行するのに十分なCPUの機会を持っていませんになり、そのようなデッドロックの原因となります。 - ミューテックス
p_thread_mutex、NSLock、@ synthronizedこの順序は、パフォーマンスの一種でなく、私たちの共通のいくつかのミューテックスによるものです。 - 再帰的ロック
NSRecursiveLockは、それは私たちに複数のロックを可能に再帰的ロック、です。 - 条件はロック
NSConditionを、私たちは信号の呼び出し方法は、スレッドが継続できるようにすることができ、待機状態になり、現在のスレッドの待機メソッド呼び出しのロック状態は、あなたはまた、放送法に呼び出すことができます。 - セマフォは、
ミューテックスを使用してもよい場合にロジックをプログラミングより複雑なシナリオに適用され、ある程度のsemphone、また、最も高いスピンロックに加えて、性能をロックすることが考えられます。
- (void)mutexLock{
//pthread_mutex
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
//NSLock
NSLock *lock = [[NSLock alloc] init];
lock.name = @"lock";
[lock lock];
[lock unlock];
//synchronized
@synchronized (self) {
}
}
- (void)RecursiveLock{
NSRecursiveLock *lock = [NSRecursiveLock alloc];
[lock lock];
[lock lock];
[lock unlock];
}
- (void)conditionLock{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
condition = [[NSCondition alloc] init];
[condition wait];
NSLog(@"finish----");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:5.0];
[condition signal];
});
}
- (void)semaphore{
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
NSLog(@"semaphoreFinish---");
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[NSThread sleepForTimeInterval:5.0];
dispatch_semaphore_signal(semaphore);
});
}
复制代码
ます。https://juejin.im/post/5cf6353ce51d45776031afb3で再現