Оператор С#
lock
не поддерживает полный набор функций класса
Monitor,
но все же позволяет получать и освобождать блокировку монитора. Чтобы задействовать оператор
lock,
укажите его в фигурных скобках вместе с упорядочиваемым кодом. Начальная и конечная точки защищаемого кода указываются фигурными скобками, поэтому нет нужды использовать оператор
unlock.
Следующий код выдаст такую же синхронизированную информацию, что и в предыдущих примерах:
using System;
using System.Threading;
class Database
{
public void SaveData(string text)
<
lock(this)
{
Console.WriteLine("Database.SaveData - Started");
Console.WriteLine("Database.SaveData - Working"); for (int 1=0; i < 100; i++)
<
Console.Write(text); }
Console.WriteLine("\nDatabase.SaveData - Ended");
} }
}
class ThreadLockApp {
public static Database db = new DatabaseO;
public static void WorkerThreadMethod1() {
Console.WriteLlne("Worker thread #1 - Started");
Console.WrlteLine
("Worker thread #1 - Calling Database.SaveData"); db.SaveData("x");
Console.WriteLlne("Worker thread #1 - Returned from Output");
}
public static void WorkerThreadMethod2() {
Console.WriteLine("Worker thread #2 - Started");
Console.WriteLine
("Worker thread "2 - Calling Database.SaveData"); db.SaveDataC'o");
Console.WriteLine("Worker thread #2 - Returned from Output"); }
public static void Main() {
ThreadStart worker"! = new ThreadStart(WorkerThreadMethodl);
ThreadStart worker2 = new ThreadStart(WorkerThreadMethod2);
Console.WriteLine("Main - Creating worker threads");
Thread t1 = new Thread(workerl); Thread t2 = new Thread(worker2);
t1.Start(); t2.Start(); } }