ロックが単なる相互排除の実装である場合、モニターは単にメソッド実行間の待機時間を利用する方法なのでしょうか?
良い説明は本当に役に立ちます....
よろしく
たとえば、C# .NET では、lock ステートメントは次のようになります。
Monitor.Enter(object);
try
{
// Your code here...
}
finally
{
Monitor.Exit(object);
}
ただし、 Monitor はWait()
およびも実行できることに注意してPulse()
ください。これは、複雑なマルチスレッドの状況で役立つことがよくあります。
編集: .NET フレームワークのそれ以降のバージョンでは、これは次のように変更されました。
bool lockTaken = false;
try
{
Monitor.Enter(object, ref lockTaken);
// Your code here...
}
finally
{
if (lockTaken)
{
Monitor.Exit(object);
}
}
それらは関連しています。たとえば、C# では、lockステートメントは、Monitor に入り、完了したら Monitorを終了する単純な try-finally ラッパーです。
モニターは、コンパイラーが支援する「半自動」ロックです。クラスなどでメソッドを宣言できsynchronized
ます。これは、相互排除を提供するための別のアプローチです。この本は、主に OS 開発者を対象としていますが、概念の最も完全な説明であることがわかりました。
モニターは、セミフォア/ロックと同じことを行うプログラミング言語の構造ですが、モニターは実行時に同期することによって共有データを制御します。対照的に、ロックは「スピン」するだけで共有データを保護するため、CPU使用率が低下する可能性があります。
ロックにより、相互排除が保証されます。
モニターは、保護するデータと、データへのアクセスを保護するために必要な相互排除および同期プリミティブを関連付けます。
同期は、たとえば、1 つのスレッドがイベントが発生するまで待機する必要がある場合に使用されます (たとえば、別のスレッドが項目をキューに入れるまで待機するなど)。
違いはありません。lock は、try/finally ブロック内で Monitor.Enter と Monitor.Exit を生成します。PulseとPulseAllを搭載しているため、モニターオーバーロックを使えば微調整が可能です。TryEnter でロックを取得できない場合は、別の処理を行うこともできます。
私がこれまでに調査した限りでは、モニターはスレッド同期の一連の原則であり、ロックは、待機や通知などの「スレッド協調」機能とともに、Java でのモニターの実装方法です。事実上、2 つの概念の間の正確な関係を形成しようとすると、ロックはモニターの実装の一部です (もう 1 つは待機メカニズムと通知メカニズムです)。間違っている場合は訂正してください。ただし、訂正が非常に具体的である場合は、本当に感謝しています。
相互排除のみにフォーカスをロックしますが、Moniter は相互排除を自動的に提供します。
そのため、Monitor で相互排除を使用することを心配する必要はありません。ME の代わりに、プログラミングを行うときにのみ同期を考慮する必要があります。
Monitor は、より体系的なプログラミング方法を提供します。したがって、それはより高度なものです。