1 /*
 2 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数
 3 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个
 4 作者:http://hi.baidu.com/jiang_yy_jiang
 5 */
 6 using System;
 7
 8 namespace ThreadTest29
 9 {
10     class Account
11     {
12         private Object thisLock = new object();
13         int balance;
14         Random r = new Random();
15
16         public Account(int initial)
17         {
18             balance = initial;
19         }
20
21         int WithDraw(int amount)
22         {
23             if (balance < 0)
24             {
25                 throw new Exception("负的Balance.");
26             }
27             //确保只有一个线程使用资源,一个进入临界状态,使用对象互斥锁,10个启动了的线程不能全部执行该方法
28             lock (thisLock)
29             {
30                 if (balance >= amount)
31                 {
32                     Console.WriteLine("----------------------------:" + System.Threading.Thread.CurrentThread.Name + "---------------");
33
34                     Console.WriteLine("调用Withdrawal之前的Balance:" + balance);
35                     Console.WriteLine("把Amount输入 Withdrawal     :-" + amount);
36                     //如果没有加对象互斥锁,则可能10个线程都执行下面的减法,加减法所耗时间片段非常小,可能多个线程同时执行,出现负数。
37                     balance = balance - amount;
38                     Console.WriteLine("调用Withdrawal之后的Balance :" + balance);
39                     return amount;
40                 }
41                 else
42                 {
43                     //最终结果
44                     return 0;
45                 }
46             }
47         }
48         public void DoTransactions()
49         {
50             for (int i = 0; i < 100; i++)
51             {
52                 //生成balance的被减数amount的随机数
53                 WithDraw(r.Next(1, 100));
54             }
55         }
56     }
57
58     class Test
59     {
60         static void Main(string[] args)
61         {
62             //初始化10个线程
63             System.Threading.Thread[] threads = new System.Threading.Thread[10];
64             //把balance初始化设定为1000
65             Account acc = new Account(1000);
66             for (int i = 0; i < 10; i++)
67             {
68                 System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(acc.DoTransactions));
69                 threads[i] = t;
70                 threads[i].Name = "Thread" + i.ToString();
71             }
72             for (int i = 0; i < 10; i++)
73             {
74                 threads[i].Start();
75             }
76             Console.ReadKey();
77         }
78     }
79 }

转载于:https://www.cnblogs.com/chriskwok/p/7804445.html

一个线程中lock用法的经典实例相关推荐

  1. c# 多线程中lock用法的经典实例

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

  2. python 线程中出现执行错乱_多处理会导致Python崩溃,并在调用fork()时在另一个线程中出现错误...

    我对Python还比较陌生,并尝试为for循环实现一个多处理模块. 我有一个图像url数组存储在img_url中,我需要下载并应用一些Google vision.if __name__ == '__m ...

  3. SQL 向:在 mysql 中创建《SQL 经典实例》中的两个主要在用的表 emp 和 dept 供大家使用

    创建 emp 表 CREATE TABLE emp (EMPNO int NOT NULL,ENAME VARCHAR (20) NOT NULL,JOB VARCHAR (20) NOT NULL, ...

  4. FFmpeg中一个线程获取视频流一个线程执行scale测试代码

    在https://blog.csdn.net/fengbingchun/article/details/94712986 中介绍过如果usb视频流编码类型为rawvideo则无需进行解码,可直接通过a ...

  5. 线程中这么调用类_这些线程知识总结是真的到位!java开发两年的我看的目瞪口呆

    前言 什么是线程:程序中负责执行的那个东东就叫做线程(执行路线,进程内部的执行序列),或着说是进程的子任务. Java中实现多线程有几种方法 继承Thread类: 实现Runnable接口: 实现Ca ...

  6. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析)

    重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程").Qt GUI必须在这个线 ...

  7. Qt对话框的事件循环分析(子线程中不能创建UI窗体分析2)

    Qt事件机制 QT-UI 后端 重要: GUI线程和辅助线程 如前所述,每个程序在启动时都有一个线程.这个线程被称为"主线程"(在Qt应用程序中也称为"GUI线程&quo ...

  8. JAVA如何在线程中加锁(四种方法)

    JAVA多线程锁 线程的生命周期 ​ 总共六种状态,可归结为五种,线程的最终是死亡,阻塞不是最终状态,只是一个临时状态.只有调用了start方法,线程才进入就绪阶段. //新生 ​ NEW, //运行 ...

  9. C#中的线程(中)-线程同步

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

最新文章

  1. Python字符串转数字
  2. “本机号码一键登录”是如何实现?
  3. UltraEdit的使用方法
  4. 升级 ServeRADI-8i控制器,使用IBM 3650 9797 老服务器支持2T 硬盘
  5. 【368天】跃迁之路——程序员高效学习方法论探索系列(实验阶段126-2018.02.08)...
  6. ae导出json_关于AE转json动画开发避坑指南
  7. 什么是 ecommerce 的 distributor 概念以及如何实现 website redirect
  8. js提取正则中的字符串
  9. BeginnersBook Java IO 教程
  10. Java 中处理 Exception 的最佳实践
  11. 在windows实现和smtp交互发送邮件
  12. 毫秒和秒的换算工具_使用后戒不掉的文档搜索工具:Everything
  13. JAVA集成华为推送 服务端
  14. OJ每日一练——计算分数加减表达式的值
  15. navicat报错 Access violation at address in module ‘navicat.exe‘
  16. python全角半角的相互转换
  17. 高等数学(第七版)同济大学 习题11-3 (后4题)个人解答
  18. GMSL高带宽视频数据接入的方法
  19. c语言中f5的作用,3G的AKA协议中F1至F5的UE端的实现(附代码C语言)
  20. Python基础总结及数据分析代码记录(一、环境准备及数据结构;二、数据采集与操作)

热门文章

  1. [转]搞ACM的你伤不起(转自Roba大神)
  2. [SharePoint 2010] Configuration SMTP for SharePoint 2010
  3. 在Powerpoint中插入Flash的方法
  4. React Native——react-navigation的使用
  5. spring之DelegatingFilterProxy
  6. saltstack pkg模块用法
  7. 【算法学习笔记】57. 前缀树 字典序优化技巧 STL学习 SJTU OJ 1366 前缀匹配
  8. grep及正则表达式
  9. My blog please navigate to http://hi.baidu.com/248828412
  10. Know more about CBO Index Cost