C# lock Statement

Published on Wednesday, September 1, 2010
c#

The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.

The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock. This statement takes the following form:

// using System.Threading;

  class Account
  {
      private Object thisLock = new Object();
      int balance;

      Random r = new Random();

      public Account(int initial)
      {
          balance = initial;
      }

      int Withdraw(int amount)
      {

          // This condition will never be true unless the lock statement
          // is commented out:
          if (balance < 0)
          {
              throw new Exception("Negative Balance");
          }

          // Comment out the next line to see the effect of leaving out 
          // the lock keyword:
          lock (thisLock)
          {
              if (balance >= amount)
              {
                  Console.WriteLine("Balance before Withdrawal :  " + balance);
                  Console.WriteLine("Amount to Withdraw        : -" + amount);
                  balance = balance - amount;
                  Console.WriteLine("Balance after Withdrawal  :  " + balance);
                  return amount;
              }
              else
              {
                  return 0; // transaction rejected
              }
          }
      }

      public void DoTransactions()
      {
          for (int i = 0; i < 100; i++)
          {
              Withdraw(r.Next(1, 100));
          }
      }
  }

  class Test
  {
      static void Main()
      {
          Thread[] threads = new Thread[10];
          Account acc = new Account(1000);
          for (int i = 0; i < 10; i++)
          {
              Thread t = new Thread(new ThreadStart(acc.DoTransactions));
              threads[i] = t;
          }
          for (int i = 0; i < 10; i++)
          {
              threads[i].Start();
          }
      }
  }

( From Microsoft site )