Конечно, вот, пожалуйста.
Обратите внимание, что общий пример взаимоблокировки - это когда вы получаете несколько блокировок, и два или более потоков в конечном итоге ждут друг друга.
Например, две блокировки, которые блокируются следующим образом:
Thread 1 Thread 2
Lock "A" Lock "B"
Lock "B" Lock "A" <-- both threads will stop dead here
waiting for the lock to be come
available.
Однако в этом примере я не беспокоился об этом, я просто позволил одному потоку заблокироваться на неопределенный срок. Вы действительно не хотите терять контроль над своими блокировками, поэтому, хотя это надуманный пример, тот факт, что фоновый поток может полностью блокировать основной поток, как этот, плох
using System;
using System.Threading;
namespace ConsoleApplication7
{
public class Program
{
public static void Main(string[] args)
{
LockableClass lockable = new LockableClass();
new Thread(new ParameterizedThreadStart(BackgroundMethod)).Start(lockable);
Thread.Sleep(500);
Console.Out.WriteLine("calling Reset");
lockable.Reset();
}
private static void BackgroundMethod(Object lockable)
{
lock (lockable)
{
Console.Out.WriteLine("background thread got lock now");
Thread.Sleep(Timeout.Infinite);
}
}
}
public class LockableClass
{
public Int32 Value1 { get; set; }
public Int32 Value2 { get; set; }
public void Reset()
{
Console.Out.WriteLine("attempting to lock on object");
lock (this)
{
Console.Out.WriteLine("main thread got lock now");
Value1 = 0;
Value2 = 0;
}
}
}
}