これに関しては、長らく議論することができる多くの詳細があります。しかし、コアで:
これらは、常にロックがどこか、何らかの形で取らされている必要があります
@synchronized(...) { ... }
[lock lock];
ロックはあなたが言及理由のために非常に高価であり、必然的にカーネルリソースを消費します。 (@synchronized()のケースは、最近カーネルのロックを避けることができますが、ハッシュベースの除外メカニズムであり、それ自体が高価です)。
、これらは常にロックを必要としない(時には多分やる):
dispatch_sync(...concurrent q...., ^{ ... });
dispatch_async(...queue of any kind...., ^{ ... });
は、彼らが使用するのに効果的(ロックなしているディスパッチ機能による高速パスがあるアトミックテストを-と設定ロード時にパフォーマンスの問題を引き起こす可能性のあるプリミティブ)。
最終的な結果として、同時キューへの同期ディスパッチは、「今すぐこのスレッドでこれを実行する」と効果的に扱うことができます。シリアル・キューへの同期ディスパッチでは、キューが処理中であるかどうかをテストし、ビジーであるとマークし、ビジーでない場合は、直ちに呼び出し側スレッドでブロックを実行するようにアトミック・テスト・アンド・セットを実行できます。
非同期ディスパッチはブロックをコピーする必要があります(これは非常に安価ですが、考えるべきことです)が、非同期ディスパッチも同様に高速にすることができます。
一般的に、GCDはロックができることは何でも行うことができます。それ以上は効率的ではありませんし、GCD APIを使用して簡単なロックを越えることができます。(セマフォを例えば、計算スロットル)。
ところで:あなたの仕事が比較的粗い場合は、NSOperationQueue
とNSOperation
を見てください。