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锁的应用的更多相关文章

  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. Gym 101775A - Chat Group - [简单数学题][2017 EC-Final Problem A]

    题目链接:http://codeforces.com/gym/101775/problem/A It is said that a dormitory with 6 persons has 7 cha ...

  2. SQL Fundamentals: 子查询 || 分析函数(PARTITION BY,ORDER BY, WINDOWING)

    SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...

  3. da5_random模块

    import random #标准模块,用来取随机数 print(random.randint(1,100)) #随机取一个整数,顾头顾尾 print(random.uniform(1,900)) # ...

  4. RoR- Database setup& SQLite ... Migrations

    *rails uses SQLite for database by default *Built-in command-line DB viewer *Self-contained,server-l ...

  5. maven工程下添加oracle驱动包

    maven工程手动安装oracle驱动包到本地仓库 下载ojdbc.jar包 这个当然是最好去官网下载了.http://mvnrepository.com这个仓库上有,具体页面地址为: http:// ...

  6. 访问GitLab的PostgreSQL数据库,查询、修改、替换等操作

    1.登陆gitlab的安装服务查看配置文件 cat /var/opt/gitlab/gitlab-rails/etc/database.yml production: adapter: postgre ...

  7. UDAF(用户自定义聚合函数)求众数

    除了逐行处理数据的udf,还有比较常见的就是聚合多行处理udaf,自定义聚合函数.类比rdd编程就是map和reduce算子的区别. 自定义UDAF,需要extends org.apache.spar ...

  8. python安装simplejson

    import simplejson 报错:ImportError: No module named simplejson simplejson是ansible一个很重要的依赖,经测试在python 2 ...

  9. postgres密码修改

    . 修改PostgreSQL数据库默认用户postgres的密码 PostgreSQL数据库创建一个postgres用户作为数据库的管理员,密码随机,所以需要修改密码,方式如下: 步骤一:登录Post ...

  10. 50.JQ---jQuery 常用小技巧

    1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return ...