一个线程中lock用法的经典实例
2017-11-08 15:49
441 查看
/* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://hi.baidu.com/jiang_yy_jiang */ using System; namespace ThreadTest29 { class Account { private Object thisLock = new object(); int balance; Random r = new Random(); public Account(int initial) { balance = initial; } int WithDraw(int amount) { if (balance < 0) { throw new Exception("负的Balance."); } //确保只有一个线程使用资源,一个进入临界状态,使用对象互斥锁,10个启动了的线程不能全部执行该方法 lock (thisLock) { if (balance >= amount) { Console.WriteLine("----------------------------:" + System.Threading.Thread.CurrentThread.Name + "---------------"); Console.WriteLine("调用Withdrawal之前的Balance:" + balance); Console.WriteLine("把Amount输入 Withdrawal :-" + amount); //如果没有加对象互斥锁,则可能10个线程都执行下面的减法,加减法所耗时间片段非常小,可能多个线程同时执行,出现负数。 balance = balance - amount; Console.WriteLine("调用Withdrawal之后的Balance :" + balance); return amount; } else { //最终结果 return 0; } } } public void DoTransactions() { for (int i = 0; i < 100; i++) { //生成balance的被减数amount的随机数 WithDraw(r.Next(1, 100)); } } } class Test { static void Main(string[] args) { //初始化10个线程 System.Threading.Thread[] threads = new System.Threading.Thread[10]; //把balance初始化设定为1000 Account acc = new Account(1000); for (int i = 0; i < 10; i++) { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(acc.DoTransactions)); threads[i] = t; threads[i].Name = "Thread" + i.ToString(); } for (int i = 0; i < 10; i++) { threads[i].Start(); } Console.ReadKey(); } } }
相关文章推荐
- c#初学-多线程中lock用法的经典实例
- c#初学-多线程中lock用法的经典实例
- 多线程中lock用法的经典实例
- c#初学-多线程中lock用法的经典实例
- 章鱼哥出品_VB.NET 线程委托应用实例 一个简单的例子让你轻松掌握委托的用法
- c# 多线程中lock用法经典实例及lock("xxx"),lock(typeof(Class)),Lock(this)的区别
- 多线程中lock用法的经典实例
- c#初学-多线程中lock用法的经典实例
- c#初学-多线程中lock用法的经典实例
- STRUTS2为每个线程提供一个ACTION实例
- 每一个Servlet只有一个实例,多个线程
- struts2为每个线程提供一个action实例
- 一个实例明白AutoResetEvent和 ManulResetEvent的用法 推荐
- 一个Servlet同一时刻只有一个实例。 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。
- Python中文分词工具之结巴分词用法实例总结【经典案例】
- X5开源框架的用法分享:一个app前端访问后端的实例 (适用于 X5_V3.0版本) by DoIt
- 一个创建多个线程的实例
- 2.2.9同一个类的不同静态方法不同实例不同线程是同步的
- sed的一个经典实例
- Java线程之锁对象Lock-同步问题更完美的处理方式代码实例