fork download
  1. using System;
  2. using System.Threading;
  3.  
  4. public class Test
  5. {
  6. public static void Main()
  7. {
  8. var ctx1 = new Foo { SleepTime = 1000, Num = 1 };
  9. var ctx2 = new Foo { SleepTime = 0, Num = 2 };
  10.  
  11. var t1 = new Thread(new ParameterizedThreadStart(Baz));
  12. var t2 = new Thread(new ParameterizedThreadStart(Baz));
  13. var t3 = new Thread(new ParameterizedThreadStart(Baz));
  14.  
  15. t1.Start(ctx1);
  16. t2.Start(ctx2);
  17.  
  18. ctx1.SleepTime = 500;
  19. t3.Start(ctx1);
  20. }
  21.  
  22. public static void Baz(object o)
  23. {
  24. Foo foo = (Foo)o;
  25.  
  26. lock (foo.SyncRoot)
  27. {
  28. foo.Bar();
  29. foo.Num = 3;
  30. }
  31. }
  32. }
  33.  
  34. class Foo
  35. {
  36. private readonly object _syncRoot = new Object();
  37.  
  38. public object SyncRoot { get { return _syncRoot; } }
  39. public int SleepTime { get; set; }
  40. public int Num { get; set; }
  41.  
  42. public void Bar()
  43. {
  44. Thread.Sleep(SleepTime);
  45. Console.WriteLine("Foo " + Num);
  46. }
  47. }
Success #stdin #stdout 0.03s 36968KB
stdin
Standard input is empty
stdout
Foo 2
Foo 1
Foo 3