using System;
using System.Threading;

namespace LockAndThread
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 class Test
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>

static Thread[] threads=new Thread[10];
  static void Main(string[] args)
  {
   Account acc=new Account(0);
   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++)
   {
    threads[i].Start();
   }
   Console.WriteLine("The threads is running !");
   Console.Read();

}
 }

class Account
 {
  int balance;
  Random r=new Random();

public Account(int initial)
  {
   balance=initial;
  }
  int Withdraw(int amount)
  {
   if (balance<0)
   {
    throw new Exception("Banlance已经为负数了!");
   }
   Console.WriteLine("The main thread output the current balance is "+balance);
   //return UseLock(amount);
  return UseInterLock(amount);
//    return UseMonitor(amount);
  }

int UseLock(int amount)
  {
   lock(this)
   {
    if (balance>=amount)
    {
     Thread.Sleep(5);
     balance=balance-amount;
     return amount;
    }
    else
    {
     return 0;//transaction reject
    }
   }
  }

int UseInterLock(int amount)
  { 
   if (balance>=amount)
   {
    int nOld=balance-amount;
    Thread.Sleep(5);
    balance=balance-amount;
    Interlocked.CompareExchange(ref balance,nOld,nOld);
    return amount;
   }
   else
   {
    return 0;
   }

}
  int UseMonitor(int amount)
  {
//   try
//   {
    //I,不限时的访问
//    Monitor.Enter(this);
    
    
    //II.在指定的时间里获取排他锁来执行
//    if (Monitor.TryEnter(this,TimeSpan.FromSeconds(30)))
//     //30秒内获取对象排他锁
    {
     if (balance>=amount)
     {
      Thread.Sleep(5);
      balance=balance-amount;
      return amount;
     }
     else
     {
      return 0;
     }

//    }
//
//   }
//   catch
//   {
//    //the
//   }

}

public void DoTransactions()
  {
   for(int i=0;i<10;i++)
   {
    Withdraw(r.Next(-50,100));
   }
  }
 }
}

转载于:https://www.cnblogs.com/itelite/archive/2007/12/11/990487.html

线程访问临界区的问题 实例,需解决相关推荐

  1. 线程访问 DevExpress控件异常时 解决方法

    线程访问 DevExpress控件异常时 解决方法 Control.CheckForIllegalCrossThreadCalls = false; DevExpress.Data.CurrencyD ...

  2. c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决

    如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的 ...

  3. C#线程间操作无效: 从不是创建控件 XX 的线程访问它

    转自:http://www.arasplm.net/index.php/zh/community/myblog/c-xx-.html 前些天做的要使用到线程的项目,现在和大家分享一下感受! 以下面小列 ...

  4. C# WinForm跨线程访问UI控件

    C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...

  5. 黄聪:BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)...

    在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选.这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作 ...

  6. C#技巧【调用线程无法访问此对象,因为另一个线程拥有该对象的问题的解决办法】【C#读写EXCEL源码提示“office检测到此文件存在一个问题。为帮助保护您的计算机,不能打开此文件”的解决】

    SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机.32位ARM Cortex-M0处理器.128kB Flash存储器.以及丰富的数字接口.SYD8801片上集成了 ...

  7. C# 中禁止跨线程访问解决-- MethodInvoker的理解

    以下引用自:   c#使用MethodInvoker解决跨线程访问控件 net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.Chec ...

  8. c#使用MethodInvoker解决跨线程访问控件

    c#使用MethodInvoker解决跨线程访问控件 .net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,有一种方法是禁止编译器对跨线程访问作检查,Control.CheckForIlle ...

  9. 解决Java线程死锁问题及代码实例

    一.问题分析 1.什么是死锁? "死锁"是多线程中出现问题的一种情况,即:多个线程因竞争资源.进程推进顺序等原因而导致各进程同时被阻塞的情形,被阻塞的进程中一个或全部处于等待某个资 ...

最新文章

  1. python3 multiprocessing 多进程 列表类型 listproxy 清除内容
  2. Hadoop学习笔记(1)
  3. 解决Linux中使用google chrome浏览器出现:ERR_PROXY_CONNECTION_FAILED 代理错误,导致不能够上网
  4. 证明并推导汉诺塔(河内之塔)问题公式
  5. Ubuntu 安装配置 MySql
  6. 黑客(续) (压位高精+状压dp)
  7. mysql数据库索引 分区_数据库设计 – 要索引的列太多 – 使用mySQL分区?
  8. [转]python中去掉字符串中的\xa0、\t、\n
  9. Typora + PicGo + Aliyun OSS + CSDN
  10. PC 平台上的一种快速 Red Hat Linux 安装方法
  11. win2008支持mysql asp.net_Win7、win2008中让IIS7支持asp的方法
  12. Javascript特效代码大全(420个)
  13. 北京圣思园XML培训视频教程下载
  14. 系统测试缺陷检出密度越大越好吗?
  15. LTK5325 2X5.3W双声道升压G类音频功率放大器
  16. 13.MD5对用户密码进行加密
  17. 麒麟 linux下安装显卡驱动,优麒麟 Linux x64 16.10
  18. python可视化分析网易云音乐评论_网易云音乐评论催泪刷屏?我用Python抓取了1008328条热评告诉你为什么!...
  19. Nature子刊:灵活的语音皮质编码可增强与任务相关的声学信息的神经处理
  20. linux do_irq 报错 代码,linux-2.6.38中断机制分析—asm_do_IRQ

热门文章

  1. 用UltraISO制作Ubuntu20.04 U盘启动盘
  2. 关于信噪比的确切含义——Eb/No和SNR的区别
  3. 调整数组顺序使奇数位于偶数前面【不保持相对位置】
  4. linux新增ssh端口80,Linux(CentOS 7) 新增或修改 SSH默认端口
  5. python 实时显示声音
  6. blast | diamond 输出结果选择和解析 | 比对
  7. mysql merge 分区
  8. 一篇关于java变量定义的文章
  9. WebSphere概要文件类型
  10. Linux内存管理优化技巧集锦