ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程

来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 21:59 点击:

阅读目录
  一:临界区概述
  二:临界区操作
  三:实例
  四:通过Interlocked类设置临界区
  五:通过Monitor类设置临界区
  一:临界区概述
  在某个时间段内可以有两个线程同时执行,那么两个线程访问的要都是同一个数据的话,那么这种情况下会出现一些不必要的事情,比如:我的银行账户总额有5000,某天我拿着存折去柜台取4000准备交物业费,媳妇拿着银行卡去取2000给孩子交学费,当某一个时间点上,我俩同时取钱,那么首先银行是这样操作的,先判断账户余额大于我要取的4000,好了给我吐出来4000大洋,因为是同时进行,媳妇那边也是先判断账户余额大于她要取的2000,好了给她吐出来2000大洋,这样的话我们账户总额只有5000元,我和我老婆却一共取出来了6000元,那么多吐出来的这1000银行只能认了,银行的账户余额为-1000,我们是不希望这种情况发生的,那么我们应该怎么做呢?应该是这样来操作的,首先当我取4000的时候,被锁住也就是我们经常说的加锁,同一个时间点上媳妇取2000的时候,取不了,等我取完了,锁被释放了,媳妇才能取,媳妇取2000的时候系统会提示余额剩下1000了,不能提取2000,那么这里临界区指的就是操作这个数据的区域
  二:临界区操作
  . Lock关键字将某个语句块标记为临界区,另一个线程不能进入临界区
  . Interlocked类为多个线程共享的变量提供原子操作
  . Monitor类提供同步对对象的访问机制,Monitor类通过向单个对象设置对象锁来控制对对象的访问,使用Enter和Exit来标记临界区的开头和结尾
  三:实例
  当我们取消Lock关键字的时候,报异常了如图一,是因为 _money为负数了,也就是账户现有金额为负数了,银行的钱为负数了,我们不取消Lock关键字如图二程序运行正常,为什么会这样呢?红色代码和黄色代码部分为原子操作,当有线程在访问红色代码部分的时候,因为是并行执行,另外的线程也进来了减钱了,如果没有lock关键字的存在,那么两个线程都能执行到黄色代码部分,比如说this._money被减少到等于500的时候,因为intAmount一直都是500,那么if(this._money >= intAmount)是成立的,那么这两个线程都能进到if的语句块里面做黄色代码部分了也就是this._money = this._money - intAmount,第一个线程0=500-500,第二个线程-500=0-500,连着减两次,所以最后this._money为负数了,所以我们要加lock关键字在一个时间点上只能一个线程进来
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading;
  namespace CriticalZone
  {
      public class Money
      {
          public int _money;//账户现有金额
       
          /// <summary>
          /// 初始化账户总额www.2cto.com
          /// </summary>
          /// <param name="intTotalMoney">账户总额</param>
          public Money(int intTotalMoney)
          {
              this._money = intTotalMoney;
          }

发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • 浅析.NET下XML数据访问新机制
  • asp.net 面试+笔试题目第1/2页
  • C# 邮件地址是否合法的验证
  • asp.net 设置GridView的选中行的实现代码
  • C#高级编程:数据库连接[1]
  • 经典C++程序1
  • IIS 自动回收导致后台定时器失效的问题解决
  • ASP.NET&#160;GridView列表代码示例
  • Asp.net MVC源码分析--Action Filter的链式调用
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1