1

次のコードを検討してください。

public class Test
{
        public void Print()
        {
            lock (this)
            {
                System.Threading.Thread.Sleep(10000);
                Console.WriteLine("Print");
            }
        }
        public static void Somthing()
        {
            Console.WriteLine("Somthing");
        }
}

printメソッド Iではlock、クラスSomthingは静的メソッドです。呼び出しのインスタンスがないため、後で呼び出すときに、個別にスレッドを実行するSomthingことPrintを期待しています。SomthingTestSomthing

private static void Main(string[] args)
{
     var test = new Test();
     test.Print();
     Test.Somthing();
}

しかし、上記のコードを書くときは、Testロックしてから呼び出しますSomthing

コンパイラがこの動作をするのはなぜですか?

4

2 に答える 2

12

ここには、別のスレッドが使用される原因となるものは何もありません。なぜだろう?あなたのコード:

  • のインスタンスを作成しますTest
  • そのインスタンスで ( callvirt)を呼び出すPrint
    • それMonitor自体をロックします(良い考えではありません)
    • 10秒間眠る
    • コンソールに行を書き込みます
    • Monitorロックを解除します
  • call静的Somethingメソッドを 呼び出す ( )
    • コンソールに行を書き込みます

余分なスレッドは必要ありません。強調しておく必要があります。ロックを解除しなくても(を使用せに)、スレッドに関しては同じように機能します。繰り返しますが、スレッドを作成しませんMonitorMonitor.EnterMonitor.Exitlock

Aは、その間、他のスレッドが同じオブジェクトを処理するのをlock単に停止 (ブロック)します。これにより、相互に排他的な領域が作成されます。スレッドを作成しません。lock

于 2013-07-29T07:52:02.940 に答える