今朝、マルチスレッドでのロックに関するランダムなテストを行っていたところ、奇妙なことに、2 つの別々のインスタンスでプライベートな「文字列」をロックすると、他のスレッドの実行が実際にブロックされることがわかりました。以下のコードを参照してください。
私を混乱させるのは、2 つのオブジェクトの「文字列」が実際には 2 つの別個のオブジェクトであることです。なぜ一方をロックすると他方がブロックされるのでしょうか。(文字列を List のような他の参照型オブジェクトに置き換えた場合、他のスレッドの実行がブロックされないことに注意してください。これは実際に期待したことです...)
class Program {
static void Main(string[] args) {
Thread th = new Thread(DoWork);
th.Start();
Thread th2 = new Thread(DoWork);
th2.Start();
}
static void DoWork() {
Test importer = new Test();
importer.SyncTest();
}
}
public class Test {
public void SyncTest() {
string find = "test";
lock(find) {
Console.WriteLine("thread starting...");
Thread.Sleep(4000);
}
}
}