• λ我爱Aspx >> C#.Net >> C#的多线程机制初探(4)_C#教程
  • C#的多线程机制初探(4)_C#教程

  • :aspxer  Դ:internet  :2007-4-28 20:57:52  ؼ:c#
  • 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

    Ҷƪл˵?
  • һƪC#的多线程机制初探(3)_C#教程
    һƪ深入理解C# 3.0的五项主要改进_C#教程