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 ...
随机推荐
- Java8 新特性之流式数据处理
一. 流式处理简介 在我接触到java8流式处理的时候,我的第一感觉是流式处理让集合操作变得简洁了许多,通常我们需要多行代码才能完成的操作,借助于流式处理可以在一行中实现.比如我们希望对一个包含整数的 ...
- partial_sum
版本1: template < class InputIterator, class OutputIterator > OutputIterator partial_sum(InputIt ...
- RFID系统 免费开源代码 开发,分享[申明:来源于网络]
RFID系统 免费开源代码 开发,分享[申明:来源于网络] 地址:http://www.codeforge.cn/s/0/RFID%E7%B3%BB%E7%BB%9F
- pytorch入门与实践-2.2-CIFAR10分类网络
1--数据载入 |----流程: DataSet->DataLoader->调用DataLoader |----DataLoader迭代器读不到数据,无报错,一直卡住的显现: DataLo ...
- Eclipse 02: 安装SVN插件
1.下载最新的Eclipse,我的版本是3.7.2 indigo(Eclipse IDE for Java EE Developers)版 如果没有安装的请到这里下载安装:http://ecli ...
- Jmeter学习之-从数据库取出数据并且校验数据是否准确
https://www.cnblogs.com/wuyonghuan/p/7479582.html 应用场景:调用某个接口像数据库中插入数据,需要在接口调用完成后查看数据更新或插入的数据是否正确的时候 ...
- CS1704问题汇总
“/”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS1704: 已经导入了具有相同的 ...
- LINUX PID 1和SYSTEMD
LINUX PID 1和SYSTEMDhttp://coolshell.cn/articles/17998.html 要说清 Systemd,得先从 Linux 操作系统的启动说起.Linux 操作系 ...
- 手写RPC框架
https://www.bilibili.com/video/av23508597?from=search&seid=6870947260580707913 https://github.co ...
- nginx cookie 丢失问题