Listing 4

using namespace System::Threading;

public ref class C
{
/*1*/ static Object^ Lock = gcnew Object;

public:
  static void F1()
  {
/*2*/   Monitor::Enter(C::typeid);
/*3*/   try {
      // perform some operation(s)
    }
    finally {
      Monitor::Exit(C::typeid);
    }
  }

  static void F2()
  {
    Monitor::Enter(C::typeid);
    // ...
    Monitor::Exit(C::typeid);
  }

  static void F3()
  {
/*4*/   Monitor::Enter(Lock);
    // ...
    Monitor::Exit(Lock);
  }

  static void F4()
  {
    Monitor::Enter(Lock);
    // ...
    Monitor::Exit(Lock);
  }
};