C#中的lock
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的更多相关文章
- C#中各种Lock的速度比较
简单写了个小程序,比较了一下C#中各种Lock的速度(前提是都没有进入wait状态). 各进入离开Lock 1kw次,结果如下: Lock Time (ms) No lock 58 CriticalS ...
- 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析
关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...
- 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的
前言 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题.那你是不是很好奇,这些Lock锁api是如何实现的呢?本 ...
- ArcGIS GDB 文件中的lock文件影响复制
复制或压缩gdb文件的时候,经常碰到有lock文件,解决方法是: 在catalog中停止相应的地图服务 如果用catalog预览过相应的地图,关闭catalog
- C#中的lock关键字有何作用
作为C#的程序员来说,在遇到线程同步的需求时最常用的就是lock关键字.但如何正确并有效地使用lock,却是能否高效地达到同步要求的关键.正因为如此,程序员需要完全理解lock究竟为程序做了什么. 所 ...
- C#中的lock关键字;就是lock住一个大家都共同访问的(静态static的)东东就行了
public class ChatService : IChat //继承IChat接口或者说IChat的实现类 { //定义一个静态对象用于线程部份代码块的锁定,用于lock操作 private s ...
- C#中的lock关键字
前几天与同事激烈讨论了一下,有一点收获,记录起来. 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. ...
- C# 中的 lock的陷阱
旧事重提了,或许很多人会奇怪,为什么 C# 不允许lock一个struct ? 例如: public void ProcessTask(int taskid){ lock(taskid){ ...
- C#中的lock关键字(初识)
http://kb.cnblogs.com/page/88513/ 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互 ...
- Java中的Lock与synchronized
并发编程学习笔记之Lock与synchronized 一.什么是可重入锁 Lcok在Java中是一个接口,一般在面试问题中问到的可能是ReentrantLock与synchronized的区别.Ree ...
随机推荐
- Vue 页面批量导入其他组件
<template> <div> <template v-for="(item) in names"> <component :is=&q ...
- Go实现动态开点线段树
1.线段树介绍 线段树是一种用于高效处理区间查询和区间更新的数据结构,当我们需要解决一个频繁更新区间值的问题的时候,就可以采用线段树的结构进行解决.线段树的核心思想是将区间分为多个子区间进行管理,越往 ...
- Spark1.6和2.0版本区别(一) 累加器
1.6版本 2.0版本
- Trae和Cursor小斗法
前情 自从AI IDE面世以来,网络上到处流传程序员要失业了,小白也能轻松完成程序开发了,某某0基础靠AI上架了苹果应用,平时工作也有偶尔用用AI工具的我,都觉得这些都是标题党文章不予理会的,直到看到 ...
- 面试题54. 二叉搜索树的第k大节点
地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ <?php /** 面试题54. ...
- linux安装lspci
点击查看代码 `lspci` 是一个用于在Linux系统中显示所有PCI总线以及已连接设备信息的命令.这个工具通常包含在 `pciutils` 包里.如果你需要在你的Linux系统上安装 `lspci ...
- Windows编程----进程:命令行参数
什么是进程的命令行参数 每个进程在启动(双击exe启动.cmd命令行启动或者由其他程序通过CreateProcess启动)的时候,都会有一个命令行参数给它.命令行的参数以空格区分.这个命令行总是不为空 ...
- ssh: connect to host github.com port 22: Connection timed out----git问题记录
今天使用git命令提交代码,git add .,git commit -m '',git push 一顿操作猛如虎啊,嘴角一勾,邪魅一笑像往常一样期待着等着进度条100%,然后直接出现ssh: con ...
- datagrid源码
/** * jQuery EasyUI 1.2.3 * * Licensed under the GPL terms * To use it on other terms please contact ...
- 数据库MVCC详解
MVCC 1.基本介绍 数据库:MySQL.[很多主流数据库都使用了MVCC,比如MySQL的InnoDB引擎.PostgreSQL.Oracle] MVCC,全称Multi-Version Conc ...