从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 学习相关推荐

  1. NIO FileChannel中的文件锁lock 学习笔记

    排它锁:又叫独占锁.对文件加排它锁后,该进程可以对此文件进行读写,该进程独 占此文件,其他进程不能读写此文件,直到该进程释放文件锁. 共享锁:某个进程对文件加共享锁,其他进程也可以访问此文件,但这些进 ...

  2. Redisson Lock 学习

    锁的实现简述: 线程同步队列 WaitThreadQueue ,利用redis list实现,存放当前正在等待锁的线程 锁等待超时时间 ThreadSet ,利用redis zset实现,hkey存放 ...

  3. 自旋锁(spin lock)学习

    目录 目的 用途 与互斥锁区别 相同点 不同点 原理 可能出现的问题 死锁(骑驴找驴) 过多占用cpu资源 使用场景 目的 为了防止多处理器并发,保护共享资源. 用途 在内核中大量用于中断处理. 对于 ...

  4. Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  5. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  6. Mysql 5.7 Gtid内部学习(十) 实际案例(二)

    本案例是我真实遇到过的一个坑,也在前文中不止一次的提到,当时也是非常纳闷,其实知道原因后只能说为什么会这么坑. 一.触发条件 本案列我测试过4个版本 percona Mysql 5.7.14 官方社区 ...

  7. java同步锁售票_Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)...

    学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程:线程是 ...

  8. Java多线程学习十三:synchronized 和 Lock 区别以及孰优孰劣,如何选择?

    synchronized 和 Lock 的异同点,以及该如何选择. 相同点 synchronized 和 Lock 的相同点非常多,我们这里重点讲解 3 个比较大的相同点 ABC. A:synchro ...

  9. 疯狂Java学习笔记(69)---------Lock

    疯狂Java学习笔记(69)---------Lock Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java ...

  10. Go 分布式学习利器(18)-- Go并发编程之lock+WaitGroup实现线程安全

    Go语言中通过Groutine 启动一个Go协程,不同协程之间是并发执行的,就像C++/Java中线程之间线程安全是一个常见的问题. 如下Go 语言代码: func TestConcurrent(t ...

最新文章

  1. 在C语言中break语句称为,在C语言中,break语句的功能是退出函数
  2. ACM计算几何题目推荐
  3. 理解Promise (1)
  4. Android Screen Monitor抓取模拟器与真机界面
  5. 机器学习常见损失函数
  6. Windows10 环境下Jupyter Notebook的安装与使用
  7. 克服大数据集群的挑战
  8. .NET CORE——Console中使用依赖注入
  9. android进阶指导
  10. 【群晖秘籍】群晖添加第三方套件,让可用功能更多更好(任性拓展)
  11. 如何在Excel中创建组合图
  12. [ZT]COMPAQ PROLIANT 8500上手动安装NetWare 4.11
  13. POI2011 同谋者 Conspiracy
  14. 内蒙古中医药杂志内蒙古中医药杂志社内蒙古中医药编辑部2022年第4期目录
  15. 手机号微信号绑定微信号_相关计算机,新手机号被绑定过微信号怎么办?这是个“二次”放号的号码...
  16. 中小学计算机教学大纲,中小学信息技术教材教法教学大纲.doc
  17. 华为5g cpe 虚拟服务器,一图看懂华为5G CPE Pro
  18. multisim仿真时示波器图像显示放大
  19. 魔趣android10主题,对标LineageOS?魔趣将发布基于安卓8.1的MK81.0 ROM
  20. 树莓派系统安装资源和步骤说明

热门文章

  1. 在Nutz中给Druid配置数据库加密
  2. GPU GEMS 3 EBOOK下载
  3. 三、 安装项目依赖以及启动项目
  4. C/C++ inline 函数
  5. ORACLE 常用函数——日期/时间函数
  6. 使用Chef管理windows集群
  7. CvtColor(转)
  8. 回忆一次面试Android研发的问题
  9. Delphi2010安装TWordApplication控件
  10. 3月25日 插值-样条插值