Form1.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace WinLock
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. private void btn_Start_Click(object sender, EventArgs e)
  22. {
  23. listBox1.Items.Clear();
  24. Thread[] threads = new Thread[];//使用new关键字在堆里创建对象,其生命期相当于全局变量,但访问的时候与普通变量一样
  25. Account acc = new Account(, this);
  26. for (int i = ; i < ; i++)
  27. {
  28. Thread t = new Thread(acc.DoTransactions);
  29. t.Name = "线程" + i;
  30. threads[i] = t;
  31. }
  32. for (int i = ; i < ; i++)
  33. {
  34. threads[i].Start();
  35. }
  36. }
  37.  
  38. delegate void AddListBoxItemDelegate(string str);//在类的内部也能声明代理
  39. public void AddListBoxItem(string str)
  40. {
  41. if (listBox1.InvokeRequired)//如果是跨线程访问控件则为true
  42. {
  43. AddListBoxItemDelegate d = AddListBoxItem;//代理
  44. listBox1.Invoke(d, str);//调用代理函数并传递参数
  45. }
  46. else
  47. {
  48. listBox1.Items.Add(str);//不是跨线程访问控件则直接访问该控件
  49. }
  50. }
  51.  
  52. }
  53. }

account.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7.  
  8. namespace WinLock
  9. {
  10. public class Account
  11. {
  12. private Object lockedObj = new Object();
  13. int balance;
  14. Random r = new Random();
  15. Form1 form1;
  16. public Account(int initial, Form1 form1)
  17. {
  18. this.form1 = form1;
  19. this.balance = initial;
  20. }
  21. /// <summary>
  22. /// 取款
  23. /// </summary>
  24. /// <param name="amount">取款金额</param>
  25. /// <returns>余额</returns>
  26. private int Withdraw(int amount)
  27. {
  28. if (balance < )
  29. {
  30. form1.AddListBoxItem("余额:" + balance + " 已经为负值了,还想取呵!");
  31. }
  32.  
  33. //将lock (lockedObj)这句注释掉,看看会发生什么情况
  34. lock (lockedObj)
  35. {
  36. if (balance >= amount)
  37. {
  38. string str = Thread.CurrentThread.Name + "取款---";
  39. str += string.Format("取款前余额:{0,-6}取款:{1,-6}", balance, amount);
  40. balance = balance - amount;
  41. str += "取款后余额:" + balance;
  42. form1.AddListBoxItem(str);
  43. return amount;
  44. }
  45. else
  46. {
  47. return ;
  48. }
  49. }
  50. }
  51. /// <summary>自动取款</summary>
  52. public void DoTransactions()//Transaction--事务
  53. {
  54. for (int i = ; i < ; i++)
  55. {
  56. Withdraw(r.Next(, ));
  57. }
  58. }
  59.  
  60. }
  61. }

不加lock 会出现统一资源被多次利用的情况

C#关于多线程及线程同步 lock锁的应用的更多相关文章

  1. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  2. 线程同步——lock锁

    线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右: Reentran ...

  3. 线程同步Lock锁

    Lock接口历史 java1.5版本之前只有synchronized一种锁,lock是java1.5版本之后提供的接口.lock接口与synchronized接口功能相同,但是需要手动获取锁和释放锁. ...

  4. Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...

  5. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  6. IOS 多线程,线程同步的三种方式

    本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...

  7. Java提高班(三)并发中的线程同步与锁

    乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...

  8. Java并发包——线程同步和锁

    Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...

  9. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

随机推荐

  1. 关于histry的pushstate 和 popstate事件的应用

    这篇文章是基础:http://www.cnblogs.com/kaituorensheng/p/3776527.html: histry的单页面应用有两个写法:哈希值和?: 哈希值例子: 实现效果:点 ...

  2. 微信小程序开发笔记01

    微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...

  3. particles.js中文开发手册

    2017年6月17日01:06:28 因为自己需要做产品,所以一个好的UI界面也是很重要的,发现这种散射的原子颗粒特效还不错,就弄了一个 官方github:https://github.com/Vin ...

  4. 使用阿里云公网ip建立bind,监听客户端连接失败

    bind: Cannot assign requested address 网上的众多答案不能解决我的问题 通过ping可以ping通,但是 使用bind代码,这个ip就是不能用的, 使用 ifcon ...

  5. iOS学习之Object-C语言属性和点语法(转载收集)

    一.属性      1.属性的声明:在.h文件中使用@property声明属性.           @property NSString *name;       2.属性的作用是生成setter以 ...

  6. Spring Security 安全验证

    摘自:https://www.cnblogs.com/shiyu404/p/6530894.html 这篇文章是对Spring Security的Authentication模块进行一个初步的概念了解 ...

  7. PowerBI更新 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)

    2019/04更新 参见这里 今天发福利啦!发福利啦!发福利啦! 企业的各种数据整合到PowerBI显示,浏览器,移动端显示关键指标. 一个很好的PowerBI解决方案的图!一图胜万字!你所需要知道的 ...

  8. Python openpyxl、pandas操作Excel方法简介与具体实例

    本篇重点讲解windows系统下 Python3.5中第三方excel操作库-openpyxl: 其实Python第三方库有很多可以操作Excel,如:xlrd,xlwt,xlwings甚至注明的数据 ...

  9. pandas处理时间序列(1):pd.Timestamp()、pd.Timedelta()、pd.datetime( )、 pd.Period()、pd.to_timestamp()、datetime.strftime()、pd.to_datetime( )、pd.to_period()

      Pandas库是处理时间序列的利器,pandas有着强大的日期数据处理功能,可以按日期筛选数据.按日期显示数据.按日期统计数据.   pandas的实际类型主要分为: timestamp(时间戳) ...

  10. sql server调优

    SQLServer调优:查询语句运行几个指标值监测\ https://www.cnblogs.com/zhijianliutang/p/4179110.html