C#中的lock

lock语法为:

private object o = new object();//创建一个对象
public void Work()
{
  lock(o)//锁住这个对象
  {
    //做一些必须按照顺序做的事情
  }
}

相当于:

private object o = new object();//创建一个对象
public void Work()
{
  Monitor.Enter(o);
  //做一些必须按照顺序做的事情
  Monitor.Exit(0);
}

目的是,在多线程中,使用lock后,能使该代码块按照指定的顺序执行,被lock这块代码已经被其中一个线程访问了,那么另外一个线程只能等待。

例子:

static int a = 0;
static int b = 0;
static void A()
{
a += 2;
Console.WriteLine($"In A,a={a}");
Thread.Sleep(5000);
b += 2;
Console.WriteLine($"In A,b={b}");
} static void B()
{
b++;
Console.WriteLine($"In B,b={b}");
Thread.Sleep(1000);
a++;
Console.WriteLine($"In B,a={a}");
} static void Main()
{
A();
B();
Console.ReadLine();
}

按照单线程,先执行A,然后B,没有问题。

output:

In A,a=2
In A,b=2
In B,b=3
In B,a=3

改为:

static void Main()
{
Task t1 = new Task(A);
Task t2 = new Task(B);
t1.Start();
t2.Start();
Console.ReadLine();
}

output:

In A,a=2
In B,b=1
In B,a=3
In A,b=3

而我们期望,不论是先执行A还是B,在同一个时间,一个线程执行A或者B,即使用线程锁lock的时候,不会出现两个线程抢占执行函数的情况;

static object o=new object();//锁对象
static int a = 0;
static int b = 0;
static void A()
{
lock (o)//锁定同一对象,仅允许同一时间,一个线程进行如下操作
{
a += 2;
Console.WriteLine($"In A,a={a}");
Thread.Sleep(5000);
b += 2;
Console.WriteLine($"In A,b={b}");
} } static void B()
{
lock (o)//锁定同一对象,仅允许同一时间,一个线程进行如下操作
{
b++;
Console.WriteLine($"In B,b={b}");
Thread.Sleep(1000);
a++;
Console.WriteLine($"In B,a={a}");
} } static void Main()
{
Task t1 = new Task(A);
Task t2 = new Task(B);
t1.Start();
t2.Start();
Console.ReadLine();
}

output:

In B,b=1
In B,a=1
In A,a=3
In A,b=3

output:

In A,a=2
In A,b=2
In B,b=3
In B,a=3

C#中的lock的更多相关文章

  1. C#中各种Lock的速度比较

    简单写了个小程序,比较了一下C#中各种Lock的速度(前提是都没有进入wait状态). 各进入离开Lock 1kw次,结果如下: Lock Time (ms) No lock 58 CriticalS ...

  2. 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析

    关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...

  3. 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的

    前言 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题.那你是不是很好奇,这些Lock锁api是如何实现的呢?本 ...

  4. ArcGIS GDB 文件中的lock文件影响复制

    复制或压缩gdb文件的时候,经常碰到有lock文件,解决方法是: 在catalog中停止相应的地图服务 如果用catalog预览过相应的地图,关闭catalog

  5. C#中的lock关键字有何作用

    作为C#的程序员来说,在遇到线程同步的需求时最常用的就是lock关键字.但如何正确并有效地使用lock,却是能否高效地达到同步要求的关键.正因为如此,程序员需要完全理解lock究竟为程序做了什么. 所 ...

  6. C#中的lock关键字;就是lock住一个大家都共同访问的(静态static的)东东就行了

    public class ChatService : IChat //继承IChat接口或者说IChat的实现类 { //定义一个静态对象用于线程部份代码块的锁定,用于lock操作 private s ...

  7. C#中的lock关键字

    前几天与同事激烈讨论了一下,有一点收获,记录起来. 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. ...

  8. C# 中的 lock的陷阱

    旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){     lock(taskid){  ...

  9. C#中的lock关键字(初识)

    http://kb.cnblogs.com/page/88513/ 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互 ...

  10. Java中的Lock与synchronized

    并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...

随机推荐

  1. C# Lambda || Linq 效率问题

    255条数据 static void Main() { List<IPEndPoint> list = new List<IPEndPoint>(); for (int i = ...

  2. VS2019 MSB6006 "CL.exe"已退出,错误代码 5

    以下为我的解决过程: 因为我不是干C++的,而且我们内网不通外网,我当初来的时候装的vs2019全家桶,然后他们开发用的是vs2015,项目有用c++做图像处理的东西,我本地的vs2015没有C++模 ...

  3. autMan奥特曼机器人-代理池配置教程

    一.优势: 全可视化 稳如老牛(从2.8.6开始) 隧道代理和接口获取,使用灵活 代理池运行状态指令可查:代理池 二.启用代理池并设置服务端口 代理池的启用与关闭,均为重启autMan生效 设置隧道代 ...

  4. 使用 kubeadm 创建高可用 Kubernetes 及外部 etcd 集群

    博客链接:使用 kubeadm 创建高可用 Kubernetes 及外部 etcd 集群 前言 Kubernetes 的官方中文文档内容全面,表达清晰,有大量示例和解析 无论任何情况下都推荐先花几个小 ...

  5. wxpython 文件重命名报错提示os.rename WinError 2]系统找不到指定的文件‘

    原因:重命名需要把文件路径带上 源码: for file in files: print(file) os.rename(file, file.replace(beforename, afternam ...

  6. [tldr]github仓库添加release

    作为一个开源项目开发者,并且把自己的代码仓库托管到了github上面,所以,可以在github上提供自己的程序的release 这通常是通过二进制可执行文件的方式提供 新建草稿 点击create a ...

  7. HTTP/1.1 优化

    避免发送 HTTP 请求 对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求-响应」的数据都缓存在本地,通过缓存技术减少请求次数. 客户端会把第一次请求以及响应 ...

  8. 使用Win32控制台实现libevent通信

    libevent版本:libevent-2.0.22-stable 服务端: #include <string.h> #include <errno.h> #include & ...

  9. linux 关机方法

    虚拟机是虚拟技术的一种,很多用户会在虚拟机上边使用命令来进行自定义操作关机,这样方便快捷,能够有更多的时间处理别的事情,那么还有没有其他更容易操作的poweroff关机命令呢?一起来看下吧. 虚拟机关 ...

  10. 关于DevExpress VCL汉化方法

    用法1:在工程中加入控件cxLocalizer; 在程序中加入如下语句: Localizer.LoadFromFile('DevLocal.ini'); Localizer.Language := ' ...