Синхронизация потоков в c#
Господа, задался вопросом, зачем в ключевом слове lock() необходима ссылка на какой-то объект. Не долго думая, написал код для проверки того, что именно по этой ссылке блокируется, весь объект содержащий ключ, слово lock или только лишь сам метод, в котором это слово встречается. Для этого сделал класс с 2 методами, один со словом lock, другой - без. Создал 4 объекта класса, каждый из которых в разных потоках вызывает один метод с блокировкой один без блокировки. И получилась оказия.
-
Ожидаемое мною поведение, если оба метода без lock - должно быть таким, что слова будут выводиться на консоль в хаотичном порядке, однако они выводятся последовательно, вначале один поток выведет слово "Глеб", потом другой, слово "Павел" (имена моих котов) и т д.
-
Ожидаемое поведение, если в методе Thr1() есть lock, тогда вначале должно много раз вывестись 100 раз слово Глеб, а потом все остальное. Но этого не происходит, и опять все выводиться по очереди. Почему?
-
Все-таки что именно за объект блокируется в слове lock и зачем его вообще туда передавать, если и так понятно, где lock там и блокировать.
Прошу прощения за большой вопрос, но уже ни гугл, ни мсдн не помогают.
Сам код:
using System;
using System.Threading;
class a
{
object o = new object();
public void Thr1()
{
//lock (o)
//{
for (int x = 0; x < 25; x++)
{
Thread.Sleep(200);
Console.WriteLine("Pavel {0}", x);
}
//}
}
public void Thr2()
{
for (int x = 0; x < 25 ;x++ )
{
Thread.Sleep(200);
Console.WriteLine("Gleb{0}", x);
}
}
}
class b
{
public static a A = new a(); Thread t; Thread t1;
public void StartThr1()
{
A.Thr1();
}
public void StartThr2()
{
A.Thr2();
}
public b()
{
t = new Thread(StartThr1); t.Start(); t.Join();
t1 = new Thread(StartThr2); t1.Start(); t1.Join();
}
}
class c
{
static void Main()
{
b B = new b();
b B1 = new b();
b B2 = new b();
b B3 = new b();
}
}
Блок lock закоменчен, чтобы пробовать как с ним, так и без него. Всем спасибо!!!