模拟10个线程,每个线程模拟100次取钱:

其实就是相当于1000个人来同时取钱。当然实际情况是取钱的人分布在不同的地区的取款机取钱。同一个取款机只能一个人操作。

关键是要保证取钱的余额要准确,不能在多人同时操作的时候计算失误,于是要在计算余额的时候锁住。lock关键作用在于此。

  static void test()
{
//初始化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();
} } public 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)
{
Console.WriteLine("no Balance.........");
return 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);
}
else
{ Console.WriteLine("balance too low :"+balance +"------------>you want amount:"+ amount );
//最终结果 }
return balance;
}
}
public void DoTransactions()
{
for (int i = 0; i < 100; i++)
{
//生成balance的被减数amount的随机数
var balance= WithDraw(r.Next(1, 100));
if (balance <= 0) {
break;
}
}
}
}

  

c# 多线程 lock的更多相关文章

  1. java多线程Lock接口简介使用与synchronized对比 多线程下篇(三)

    前面的介绍中,对于显式锁的概念进行了简单介绍 显式锁的概念,是基于JDK层面的实现,是接口,通过这个接口可以实现同步访问 而不同于synchronized关键字,他是Java的内置特性,是基于JVM的 ...

  2. 多线程-lock锁

    package 多线程.lock锁; import java.util.concurrent.locks.ReentrantLock; /*. * * //同步代码块 * * */ public cl ...

  3. 【转】C#多线程Lock使用

    一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行, ...

  4. C# 多线程(lock,Monitor,Mutex,同步事件和等待句柄)

    本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而 ...

  5. jdk1.5多线程Lock接口及Condition接口

    jdk1.5多线程的实现的方式: jdk1.5之前对锁的操作是隐式的 synchronized(对象) //获取锁 { } //释放锁 jdk1.5锁的操作是显示的:在包java.util.concu ...

  6. C#多线程lock解决数据同步

    1.代码实例: public class ThreadTest4 { public static void Init() { //多个线程修改同一个值,使用lock锁解决并发 ; i < ; i ...

  7. BAT美团滴滴java面试大纲(带答案版)之三:多线程Lock

    继续面试大纲系列文章. 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生:而滥用则会遭其反噬. 在多线程编程中要渡的第二个“劫”,则是Lock.在很多时候, ...

  8. BAT美团滴滴java面试大纲(带答案版)之四:多线程Lock

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸 ...

  9. [Python 多线程] Lock、阻塞锁、非阻塞锁 (八)

    线程同步技术: 解决多个线程争抢同一个资源的情况,线程协作工作.一份数据同一时刻只能有一个线程处理. 解决线程同步的几种方法: Lock.RLock.Condition.Barrier.semapho ...

  10. C# 多线程 lock 实例

    class Program { static void Main(string[] args) { //在t1线程中调用LockMe,并将deadlock设为true(将出现死锁) int i = 1 ...

随机推荐

  1. Centos7下Docker搭建Matomo

    1.docker安装和启动 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repo ...

  2. chapter4 quantum circuits

    本章内容为 P172--P215: 主机 word 文件为: chapter4.docx 详情见文件 chapter4.1_singlequbit.cdf  或主机同名文件 4.7 Simulatio ...

  3. 基于sqli-labs Less-5 sql报错注入详解

    按照之前的思路发现,是正常的'闭合的字符型,但是在联合注入0' union select 1,2,3--+没有回显注入点,只是回显You are in,因此无法使用联合注入,考虑使用报错注入或者盲注. ...

  4. LeetCode128 最长连续序列

    最长连续序列 题目链接:LeetCode128 描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度. 请你设计并实现时间复杂度为 O(n) 的算法 ...

  5. 使用wxpython开发跨平台桌面应用,动态工具的创建处理

    在我们开发系统的时候,往往需要一个很容易理解功能的工具栏,工具栏是一个系统的快速入口,美观易用的工具栏是可以给系统程序增色不少的,本篇随笔介绍在使用wxpython开发跨平台桌面应用,工具栏的动态展现 ...

  6. gearman任务分发改进

    基于我上次在这里发现的问题,就是一次性投递20个消息,用sleep等待后发现,最后一个任务需要等前面19个都跑完才能执行,所以这里做一下改进. client.php <?php $client ...

  7. Python网络爬虫之requests模块2

    Python网络爬虫之requests模块(2) 今日内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 知识点回顾 xpath的解析流程 bs4的解析流程 ...

  8. 在线文档-Wiki平台

    GitBook 对于在线文档创作平台,当然还是首推GitBook GitBook为免费用户提供 10个空间(可以私有也可以公开) 支持自定义域名 gitbook本身是一个开源项目,你可以下载源代码自行 ...

  9. Ant Design Pro项目ProTable怎么获取搜索表单值

    前情 公司有经常需要做一些后台管理页面,我们选择了Ant Design Pro,它是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案. 产品效果图 最新接到的一个后 ...

  10. 【Amadeus原创】查看正在运行的docker run参数

    如何查看一个运行docker 容器的docker run启动参数,假设没有使用docker-compose这样的编排工具. 现在我如何进行重启,如何找回此前的启动命令? [root@mysql3 ~] ...