C# lock 学习
从MSDN上看的例子,加上从网上看到的对于lock的一些解释,自己加以总结注释,记录一下。
先看代码:
class Program{static void Main(string[] args){//实例化线程数组Thread[] threads = new Thread[10];//实例化Account对象Account acc = new Account(1000);//构建十个线程赋值到threadsfor(int i=0;i<10;i++){Thread t=new Thread(new ThreadStart(acc.DoTransactions));threads[i]=t; }//执行线程for (int i = 0; i < 10; i++){threads[i].Start();}Console.ReadKey();}}class Account{//一个只读的Object对象实例,用来锁定private readonly Object thisLock = new Object();//用来在构建构造函数时赋值的 金额int balance;//随即对象Random r = new Random();/// <summary>/// 构造函数/// </summary>/// <param name="initial"></param>public Account(int initial){balance = initial;}/// <summary>/// 减金额/// </summary>/// <param name="amount">要减去的金额</param>/// <returns>返回 减去后的金额</returns>int Withdraw(int amount){if (balance < 0)throw new Exception("Negative Balance");//lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。//这里将 只读的Object对象实例thisLock锁定lock (thisLock){//要减去的金额大于 账号上的金额if (balance >= amount){Console.WriteLine("Balance before Withdrawal :{0}", balance);Console.WriteLine("Amount to Withdraw : -{0}", amount);balance = balance - amount;Console.WriteLine("Balance after Withdrawal :{0}", balance);Console.WriteLine(" ");return amount;}else{return 0;}}}/// <summary>/// 随即获取1-100的值 传给Withdraw()方法/// </summary>public void DoTransactions(){for (int i = 0; i < 100; i++){Withdraw(r.Next(1, 100));}}}
MSDN中对于lock的解释:lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。
本例中使用了只读的Object对象实例thisLock来执行锁定。比如线程a执行到了lock(thisLock),判断thisLock是否被锁定,得知未被锁定,a锁定thisLock,执行”{}“内的语句。b此时也执行到了这里,得知thisLock已经被锁定了(a正在锁定中),b就等待,直到a执行完,b在执行lock。
MSDN中讲到lock(this)、lock(type(MyType))、lock(“myLock”)时是会有问题的,现在来说下为什么会有问题。
lock(this):如果实例可以被公共访问,则出现问题。这里会有两个问题:1>实例可被公共访问时,这里的锁定会导致其他访问不可用。2>这种锁定只能锁定当前实例,对其他实例没用。
lock(type(MyType)):这种锁定解决了上述情况的第二种问题,但是他出现第一种问题的可能性更大了。
lock(“myLock”):程序中任何使用“myLock”字符串的地方都会共享这个锁定。
综上所述,MSDN中给出的最佳做法是“定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。”
所以最佳办法是用 private static readonly Object lockThis=new Object();来锁定。
private:避免其他地方使用。
static:可以锁定到所有实例。
readonly:保证锁定的对象不被修改,否则后面的线程会畅通无阻了。
转载于:https://www.cnblogs.com/feiDD/articles/2871079.html
C# lock 学习相关推荐
- NIO FileChannel中的文件锁lock 学习笔记
排它锁:又叫独占锁.对文件加排它锁后,该进程可以对此文件进行读写,该进程独 占此文件,其他进程不能读写此文件,直到该进程释放文件锁. 共享锁:某个进程对文件加共享锁,其他进程也可以访问此文件,但这些进 ...
- Redisson Lock 学习
锁的实现简述: 线程同步队列 WaitThreadQueue ,利用redis list实现,存放当前正在等待锁的线程 锁等待超时时间 ThreadSet ,利用redis zset实现,hkey存放 ...
- 自旋锁(spin lock)学习
目录 目的 用途 与互斥锁区别 相同点 不同点 原理 可能出现的问题 死锁(骑驴找驴) 过多占用cpu资源 使用场景 目的 为了防止多处理器并发,保护共享资源. 用途 在内核中大量用于中断处理. 对于 ...
- Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- JUC.Condition学习笔记[附详细源码解析]
JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...
- Mysql 5.7 Gtid内部学习(十) 实际案例(二)
本案例是我真实遇到过的一个坑,也在前文中不止一次的提到,当时也是非常纳闷,其实知道原因后只能说为什么会这么坑. 一.触发条件 本案列我测试过4个版本 percona Mysql 5.7.14 官方社区 ...
- java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...
学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...
- Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?
synchronized 和 Lock 的异同点,以及该如何选择. 相同点 synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点 ABC. A:synchro ...
- 疯狂Java学习笔记(69)---------Lock
疯狂Java学习笔记(69)---------Lock Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java ...
- Go 分布式学习利器(18)-- Go并发编程之lock+WaitGroup实现线程安全
Go语言中通过Groutine 启动一个Go协程,不同协程之间是并发执行的,就像C++/Java中线程之间线程安全是一个常见的问题. 如下Go 语言代码: func TestConcurrent(t ...
最新文章
- 在C语言中break语句称为,在C语言中,break语句的功能是退出函数
- ACM计算几何题目推荐
- 理解Promise (1)
- Android Screen Monitor抓取模拟器与真机界面
- 机器学习常见损失函数
- Windows10 环境下Jupyter Notebook的安装与使用
- 克服大数据集群的挑战
- .NET CORE——Console中使用依赖注入
- android进阶指导
- 【群晖秘籍】群晖添加第三方套件,让可用功能更多更好(任性拓展)
- 如何在Excel中创建组合图
- [ZT]COMPAQ PROLIANT 8500上手动安装NetWare 4.11
- POI2011 同谋者 Conspiracy
- 内蒙古中医药杂志内蒙古中医药杂志社内蒙古中医药编辑部2022年第4期目录
- 手机号微信号绑定微信号_相关计算机,新手机号被绑定过微信号怎么办?这是个“二次”放号的号码...
- 中小学计算机教学大纲,中小学信息技术教材教法教学大纲.doc
- 华为5g cpe 虚拟服务器,一图看懂华为5G CPE Pro
- multisim仿真时示波器图像显示放大
- 魔趣android10主题,对标LineageOS?魔趣将发布基于安卓8.1的MK81.0 ROM
- 树莓派系统安装资源和步骤说明