C#关于多线程及线程同步 lock锁的应用
Form1.cs
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WinLock
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void btn_Start_Click(object sender, EventArgs e)
- {
- listBox1.Items.Clear();
- Thread[] threads = new Thread[];//使用new关键字在堆里创建对象,其生命期相当于全局变量,但访问的时候与普通变量一样
- Account acc = new Account(, this);
- for (int i = ; i < ; i++)
- {
- Thread t = new Thread(acc.DoTransactions);
- t.Name = "线程" + i;
- threads[i] = t;
- }
- for (int i = ; i < ; i++)
- {
- threads[i].Start();
- }
- }
- delegate void AddListBoxItemDelegate(string str);//在类的内部也能声明代理
- public void AddListBoxItem(string str)
- {
- if (listBox1.InvokeRequired)//如果是跨线程访问控件则为true
- {
- AddListBoxItemDelegate d = AddListBoxItem;//代理
- listBox1.Invoke(d, str);//调用代理函数并传递参数
- }
- else
- {
- listBox1.Items.Add(str);//不是跨线程访问控件则直接访问该控件
- }
- }
- }
- }
account.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace WinLock
- {
- public class Account
- {
- private Object lockedObj = new Object();
- int balance;
- Random r = new Random();
- Form1 form1;
- public Account(int initial, Form1 form1)
- {
- this.form1 = form1;
- this.balance = initial;
- }
- /// <summary>
- /// 取款
- /// </summary>
- /// <param name="amount">取款金额</param>
- /// <returns>余额</returns>
- private int Withdraw(int amount)
- {
- if (balance < )
- {
- form1.AddListBoxItem("余额:" + balance + " 已经为负值了,还想取呵!");
- }
- //将lock (lockedObj)这句注释掉,看看会发生什么情况
- lock (lockedObj)
- {
- if (balance >= amount)
- {
- string str = Thread.CurrentThread.Name + "取款---";
- str += string.Format("取款前余额:{0,-6}取款:{1,-6}", balance, amount);
- balance = balance - amount;
- str += "取款后余额:" + balance;
- form1.AddListBoxItem(str);
- return amount;
- }
- else
- {
- return ;
- }
- }
- }
- /// <summary>自动取款</summary>
- public void DoTransactions()//Transaction--事务
- {
- for (int i = ; i < ; i++)
- {
- Withdraw(r.Next(, ));
- }
- }
- }
- }
不加lock 会出现统一资源被多次利用的情况
C#关于多线程及线程同步 lock锁的应用的更多相关文章
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 线程同步——lock锁
线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右: Reentran ...
- 线程同步Lock锁
Lock接口历史 java1.5版本之前只有synchronized一种锁,lock是java1.5版本之后提供的接口.lock接口与synchronized接口功能相同,但是需要手动获取锁和释放锁. ...
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...
- python笔记10-多线程之线程同步(锁lock)
前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...
- IOS 多线程,线程同步的三种方式
本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...
- Java提高班(三)并发中的线程同步与锁
乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...
- Java并发包——线程同步和锁
Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
随机推荐
- 关于histry的pushstate 和 popstate事件的应用
这篇文章是基础:http://www.cnblogs.com/kaituorensheng/p/3776527.html: histry的单页面应用有两个写法:哈希值和?: 哈希值例子: 实现效果:点 ...
- 微信小程序开发笔记01
微信小程序开发的优势 1,不用安装,即开即用,用完就走.省流量,省安装时间,不占用桌面: 2,体验上虽然没法完全媲美原生APP,但综合考虑还是更优: 3,对于小程序拥有者来说,开发成本更低,他们可以更 ...
- particles.js中文开发手册
2017年6月17日01:06:28 因为自己需要做产品,所以一个好的UI界面也是很重要的,发现这种散射的原子颗粒特效还不错,就弄了一个 官方github:https://github.com/Vin ...
- 使用阿里云公网ip建立bind,监听客户端连接失败
bind: Cannot assign requested address 网上的众多答案不能解决我的问题 通过ping可以ping通,但是 使用bind代码,这个ip就是不能用的, 使用 ifcon ...
- iOS学习之Object-C语言属性和点语法(转载收集)
一.属性 1.属性的声明:在.h文件中使用@property声明属性. @property NSString *name; 2.属性的作用是生成setter以 ...
- Spring Security 安全验证
摘自:https://www.cnblogs.com/shiyu404/p/6530894.html 这篇文章是对Spring Security的Authentication模块进行一个初步的概念了解 ...
- PowerBI更新 - 解决方案架构 - PowerBI Solution Architecture(一图胜万字!)
2019/04更新 参见这里 今天发福利啦!发福利啦!发福利啦! 企业的各种数据整合到PowerBI显示,浏览器,移动端显示关键指标. 一个很好的PowerBI解决方案的图!一图胜万字!你所需要知道的 ...
- Python openpyxl、pandas操作Excel方法简介与具体实例
本篇重点讲解windows系统下 Python3.5中第三方excel操作库-openpyxl: 其实Python第三方库有很多可以操作Excel,如:xlrd,xlwt,xlwings甚至注明的数据 ...
- 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(时间戳) ...
- sql server调优
SQLServer调优:查询语句运行几个指标值监测\ https://www.cnblogs.com/zhijianliutang/p/4179110.html