ロック (計算機科学)
ロック機構が正しく機能するにはその状態を保持できるだけのリソースが確保されている必要がある。リソースが確保できない場合、クラッシュするよりは失敗するほうがよいが、例えばロック機構が「(何らかの理由で)ロックを獲得できませんでした」とエラーを返してくる可能性があるなら、アプリケーションはその状況にうまく対処できなければならない。そのためにはアプリケーションの論理設計の段階から考慮する必要がある。
ロックを避ける並行性制御戦略としてブロックしない同期手法を使うことがあげられる。例えば、lock-freeプログラミング技法やトランザクショナルメモリなどがある。しかし、そういった技法を使ったとしてもロックにまつわる問題を全て完全に回避できるわけではない。
どんな並行性制御戦略でも、OSのより基礎的なレベルでの実際のロック機構の実装を必要とし、単にアプリケーションのレベルで実装の詳細をロックを必要としないように見せているだけである。「問題」は依然として存在するが、それを扱うのはアプリケーションではない。実際、ロック機構は最終的にはCPUハードウェアの提供する不可分操作技法に依存している。
Java は synchronized という修飾子を提供しており、コードのブロックであるメソッドまたはオブジェクトに対してロックを配置でき、並行性セーフなデータ構造を特徴とするライブラリも提供している。
C#言語には、lock という予約語があり、他のスレッドに邪魔されずに実行可能なコードブロックを定義する。
VB.NET では SyncLock という予約語があり、C# の lock とほぼ同様である。
Python にはそのような予約語はないが、ロックの取得・解放のための低レベルな排他制御機構を使用可能である。
Ruby も同期のための予約語を提供していないが、低レベル排他制御オブジェクトを明示的に使用することは可能である。
x86のアセンブリ言語では、LOCK というプレフィックスを配することで不可分操作であることを保証でき、他のプロセッサが途中で干渉してくるのを避けることができる。
Objective-C では "@synchronized" という予約語でコードブロックにロックを配することができ、また NSLock、NSRecursiveLock、NSConditionLockというクラスや NSLocking というロック用プロトコルも提供している。