技术开发 频道

C#的多线程机制初探(4)


【IT168技术文档】


  expression代表你希望跟踪的对象,通常是对象引用。一般地,如果你想保护一个类的实例,你可以使用 this;如果你希望保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

  下面是一个使用lock关键字的典型例子,我将在注释里向大家说明lock关键字的用法和用途:
 //lock.cs   using System;   using System.Threading;   internal class Account   {     int balance;     Random r = new Random();     internal Account(int initial)     {       balance = initial;     }     internal int Withdraw(int amount)     {       if (balance < 0)       {         //如果balance小于0则抛出异常         throw new Exception("Negative Balance");       }       //下面的代码保证在当前线程修改balance的值完成之前       //不会有其他线程也执行这段代码来修改balance的值       //因此,balance的值是不可能小于0的       lock (this)       {         Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);         //如果没有lock关键字的保护,那么可能在执行完if的条件判断之后         //另外一个线程却执行了balance=balance-amount修改了balance的值         //而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了         //但是,这个线程却继续执行balance=balance-amount,所以导致balance可能小于0         if (balance >= amount)         {           Thread.Sleep(5);           balance = balance - amount;           return amount;         }         else         {           return 0; // transaction rejected         }       }     }     internal void DoTransactions()     {       for (int i = 0; i < 100; i++)         Withdraw(r.Next(-50, 100));     }   }   internal class Test   {     static internal Thread[] threads = new Thread[10];     public static void Main()     {       Account acc = new Account (0);       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].Name=i.ToString();       for (int i = 0; i < 10; i++)         threads[i].Start();       Console.ReadLine();     }   }
0
相关文章