.NET中多线程的同步资源访问

来源:互联网 发布:中南民族大学网络使用 编辑:程序博客网 时间:2024/06/06 01:45

  在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应。对于服务器应用程序,多线程处理提供了用不同线程处理每个传入请求的能力。否则,在完全满足前一个请求之前,将无法处理每个新请求。

  然而,线程的异步特性意味着必须协调对资源(如文件句柄、网络连接和内存)的访问。否则,两个或更多的线程可能在同一时间访问相同的资源,而每个线程都不知道其他线程的操作。结果将产生不可预知的数据损坏。

  让我们先来看一片java的例子:多线程未同步可能导致的问题及其解决方案

  下面是C#的代码

  www.nvhdj.com

  public void transfer(int from, int to, double amount) {

  if (accounts[from] < amount) return;

  Console.WriteLine(System.Threading.Thread.CurrentThread.Name);

  accounts[from] -= amount;

  Console.WriteLine(\"{0:F2} from {1} to {2}\", amount, from, to);

  accounts[to] += amount;

  Console.WriteLine(\"Total Balance: {0:F2}\", getTotalBalance());

  }run方法

  public void run() {

  Random rand;

  try {

  while (true) {

  rand = new Random();

  int toAccount = rand.Next(bank.size);

  double amount = rand.NextDouble() * maxAmount;

  bank.transfer(fromAccount, toAccount, amount);

  System.Threading.Thread.Sleep(rand.Next(DELY));

  www.nwdie.com

  catch { }

  }

  这个问题在.net中同样存在,对于.net有下面几中解决方案可以确保安全的执行多线程处理:

  1)lock 关键字

  2)监视器

  3)同步事件和等待句柄

  4)Mutex 对象

  这里我们只说一下使用lock关键字,如果需要更多信息,请访问msdn:

  ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_csref/html/413e1f28-a2c5-4eec-8338-aa43e7982ff4.htm

  lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

  lock 语句以关键字 lock 开头,它有一个作为参数的对象,在该参数的后面还有一个一次只能由一个线程执行的代码块。例如:

  public void Function()

  {

  System.Object lockThis = new System.Object();

  lock(lockThis)

  {

  // Access thread-sensitive resources.

  }

  }

  修改run方法

  public void run() {

  www.oalej.com

  try{

  while (true) {

  lock (bank) {

  rand = new Random();

  int toAccount = rand.Next(bank.size);

  double amount = rand.NextDouble() * maxAmount;

  bank.transfer(fromAccount, toAccount, amount);

  System.Threading.Thread.Sleep(rand.Next(DELY)); [Page]

  }

  }

  }

  catch{}

  }使用lock关键字锁住了bank对象的实例,lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放.

  这里使用lock需要注意的是:

  应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock (\"myLock\") 违反此准则:

  1.如果实例可以被公共访问,将出现 lock (this) 问题。

  2.如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题

  3.由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题.

  就我个人而言,我觉得多线程如果要访问共享数据必须同步 。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为重启后忘了解锁密码怎么办 华为mate.9上网速度慢怎么办 华为mate10上网速度慢怎么办 四核豌豆2变砖怎么办 苹果32g不够用怎么办 移动4g网络卡怎么办 移动4g网非常卡怎么办 移动4g卡网速慢怎么办 手机移动4g网卡怎么办 华为手机摄像头进灰怎么办 美图t8忘记密码怎么办 华为mate7忘记开机密码怎么办 华为mate9开机密码忘记怎么办 华为手机系统更新失败怎么办 mate9系统升级后耗电快怎么办 华为荣耀手机耗电快怎么办 荣耀10手机拍照不清晰怎么办 荣耀6x拍照模糊怎么办 华为荣耀P9进水了怎么办 苹果5s手机信号不好怎么办 苹果5s信号不好怎么办? 苹果5s像素不好怎么办 华为mate边缘有缝怎么办 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办