Lock
При записі чи читанні з файлу, або роботою в інтернеті lock() обмежує кількість потоків, які одночасно отримують доступ до ресурсу (до одного)
private static object locker = new object();
static void Main(string[] args)
{
for (int i = 0; i < 6; i++)
{
// new Thread(F1).Start();
Task.Run(() => F1());
}
Console.ReadKey();
}
static void F1()
{
Console.WriteLine("Wait... " + Thread.CurrentThread.ManagedThreadId);
lock(locker)
{
Console.WriteLine("START> " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
Console.WriteLine("END " + Thread.CurrentThread.ManagedThreadId);
}
}
Wait... 6
START> 6
Wait... 11
Wait... 12
Wait... 14
Wait... 17
Wait... 13
END 6
START> 11
END 11
START> 12
END 12
START> 14
END 14
START> 13
END 13
START> 17
END 17
При виконанні блоку коду lock (locker) інші потоки не переривають виведення даних з поточного потоку і не збивають значенні змінної х
static int x = 0;
static object locker = new object();
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Thread myThread = new Thread(F1);
myThread.Name = "Thread " + i.ToString();
myThread.Start();
}
Console.ReadLine();
}
public static void F1()
{
lock (locker)
{
x = 1;
for (int i = 1; i < 9; i++)
{
Console.WriteLine(Thread.CurrentThread.Name + ": " + x);
x++;
Thread.Sleep(100);
}
}
}
Thread 0: 1
Thread 0: 2
Thread 0: 3
Thread 0: 4
Thread 0: 5
Thread 0: 6
Thread 0: 7
Thread 0: 8
Thread 1: 1
Thread 1: 2
Thread 1: 3
Thread 1: 4
Thread 1: 5
Thread 1: 6
Thread 1: 7
Thread 1: 8
Thread 2: 1
Thread 2: 2
Thread 2: 3
Thread 2: 4
Thread 2: 5
Thread 2: 6
Thread 2: 7
Thread 2: 8
Thread 3: 1
Thread 3: 2
Thread 3: 3
Thread 3: 4
Thread 3: 5
Thread 3: 6
Thread 3: 7
Thread 3: 8
Thread 4: 1
Thread 4: 2
Thread 4: 3
Thread 4: 4
Thread 4: 5
Thread 4: 6
Thread 4: 7
Thread 4: 8
Без lock (locker)
Thread 0: 1
Thread 1: 1
Thread 3: 1
Thread 2: 1
Thread 4: 1
Thread 0: 2
Thread 3: 2
Thread 2: 2
Thread 4: 2
Thread 1: 2
Thread 3: 7
Thread 2: 7
Thread 1: 7
Thread 0: 7
Thread 4: 7
Thread 0: 12
Thread 1: 12
Thread 4: 12
Thread 2: 12
Thread 3: 12
Thread 1: 17
Thread 4: 17
Thread 0: 17
Thread 2: 17
Thread 3: 17
Thread 1: 22
Thread 3: 23
Thread 0: 23
Thread 4: 23
Thread 2: 23
Thread 1: 27
Thread 0: 28
Thread 4: 28
Thread 3: 28
Thread 2: 28
Thread 1: 32
Thread 0: 33
Thread 3: 33
Thread 4: 33
Thread 2: 33