c# lock关键字的使用
2010-12-29 22:06
381 查看
C#提供了一个lock关键字,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。在C#中,C# lock关键字定义如下:
lock(expression) statement_block
expression代表你希望跟踪的对象,通常是对象引用。
◆如果你想保护一个类的实例,一般地,你可以使用this;
◆如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。
而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。
下面是一个使用C# lock关键字的典型例子,在注释里说明了C# lock关键字的用法和用途。
lock(expression) statement_block
expression代表你希望跟踪的对象,通常是对象引用。
◆如果你想保护一个类的实例,一般地,你可以使用this;
◆如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。
而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。
下面是一个使用C# lock关键字的典型例子,在注释里说明了C# lock关键字的用法和用途。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication3 { class Program { private Object thisLock = new Object(); int balance; Random r = new Random(); public Program(int initial) { balance = initial; } int Withdraw(int amount) { // This condition will never be true unless the lock statement // is commented out: if (balance < 0) { Console.WriteLine("balance小于0"); throw new Exception("Negative Balance"); } //情况一,在没有家LOCK的情况下,看一下线程是如何运行的 //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 //{ // Console.WriteLine("false"); // return 0; // transaction rejected //} // 情况二,在加了lock后看看线程是如何运行的 lock (thisLock) { //如果没有lock关键字的保护,那么可能在执行完if的条件判断之后 //另外一个线程却执行了balance=balance-amount修改了balance的值 //而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了 //但是,这个线程却继续执行balance=balance-amount,所以导致balance可能小于0 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 { Console.WriteLine("false"); 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]; Program acc = new Program (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++) { Console.WriteLine("这是第" + i + "轮"); threads[i].Start(); } Thread.Sleep(3000000); } } }
相关文章推荐
- C#中Lock关键字的使用
- C# 使用lock关键字lock不同的对象
- C# 使用lock关键字lock不同的对象
- C#中怎么使用lock关键字
- C#Lock关键字的使用
- 一起谈.NET技术,C#中的lock关键字
- 使用C#中的out关键字,用世界杯演绎
- C# var 的关键字的使用
- C#使用Monitor类、Lock和Mutex类进行多线程同步
- 如何:使用 C++ 实现 C# 的 is 和 as 关键字
- 18个不常见的C#关键字,您使用过几个?
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
- C#系列教程——lock语句定义及使用
- 浅谈c#中使用lock的是与非
- C#中using关键字的使用
- 描述C#多线程中 lock关键字
- C#使用yield关键字让自定义集合实现foreach遍历的方法
- C#使用Monitor类、Lock和Mutex类进行多线程同步
- 用MSIL剥开C#的外衣(一):方法参数ref、out、params和lock、for和foreach关键字
- .NET/C# 使用async和await关键字调用异步方法