首页 > 编程语言 >[C#]c#中数据的同步加锁机制 的几种方法

[C#]c#中数据的同步加锁机制 的几种方法

时间:2023-06-05 22:04:45浏览次数:39  
标签:加锁 obj Monitor C# lock 代码 System c# Wait

一,锁定机制最简单的做法就是使用锁定关键字Lock。Lock关键字英文中就是锁的意思,顾名思义就是为操作加上一把锁。它的语法如下:

 

lock(lockObj)
{
//加锁的代码段,一般是操作共同资源的代码
}

二、同步方法(synchronized)

案例代码:

using System;

using System.Runtime.CompilerServices;

namespace App4Thread
{
	class Program
	{
		private static int count = 0;
	    private static object myMutex = new object();
	    
	    [MethodImpl(MethodImplOptions.Synchronized)]
	    public static void Main()
	    {
	         count++;
	
	    }
	}
	
}

[MethodImpl(MethodImplOptions.Synchronized)],该属性在方法调用期间锁定,阻止其他调用者调用。

命名空间:System.Runtime.CompilerServices

程序集:mscorlib(mscorlib.dll 中)

功能:System.Runtime.CompilerServices命名空间为编译器编写器提供使用托管代码在元数据中指定属性。

 

 

 三c#中Monitor的使用

 首先lock和Minitor有什么区别呢?

其实lock在IL代码中会被翻译成Monitor。也就是Monitor.Enter(obj)和Monitor.Exit(obj).

lock(obj)

{

}

等价为:

try

{    
      Monitor.Enter(obj)
}

catch()

{}

finally

{
      Monitor.Exit(obj)


}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那么Monitor额外的功能呢?

1:Monitor.TryEnter(obj,timespan)----timeout之后,就不执行这段代码了。lock可是一直会死等的。
2:还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权

 

 

 

 

 

 




lock(obj)

{

}

等价为:

try

{    
      Monitor.Enter(obj)
}

catch()

{}

finally

{
      Monitor.Exit(obj)


}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那么Monitor额外的功能呢?

1:Monitor.TryEnter(obj,timespan)----timeout之后,就不执行这段代码了。lock可是一直会死等的。
2:还有Monitor.Wait()和Monitor.Pulse()。在lock代码里面如果调用了Monitor.Wait(),会放弃对资源的所有权

标签:加锁,obj,Monitor,C#,lock,代码,System,c#,Wait
From: https://blog.51cto.com/u_4018548/6419772

相关文章

  • C# 通过反射获取特性的值
    特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([])来描述的。特性(Attribute)用于添加元数据,如编译器指令和注释、描述、......
  • C# 中==与Equals方法比较
    先来段代码,如下:staticvoidMain(string[]args){stringa=newstring(newchar[]{'h','e','l','l','o'});stringb=newstring(newchar[]{'h','e',&......
  • .static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗。
    static的作用:对变量:1.局部变量:在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。  1)内存中的位置:静态存储区  2)初始化:局部的静态变量只能被初始化一次,且C中不可以用变量对其初始化,而C++可以用变量对其初始化。  3)作用域:作用域仍为局部作用域,当定义它的......
  • C# 中的CTS, CLS, CLR 的理解
     ......
  • 异步编程async体会
    namespace异步编程{classProgram{staticvoidMain(string[]args){Console.WriteLine("mianthisisasync{0}",Thread.CurrentThread.ManagedThreadId);Do();......
  • Elastic_Search 和java的入门结合
    1,pom文件添加依赖... 2,config配置文件  3,写接口文件 ......
  • variable-sized object may not be initialized
    #include<stdio.h>intmain(void){intN;scanf("%d",&N);inta[N]={0};//错误在这,可以用变量定义数组,但不能初始化for(inti=0;i<N;++i){scanf("%d",&a[i]);}intM,sum=0;scanf("%d",&......
  • 探秘C#中的yield关键字
     在"C#中,什么时候用yieldreturn"中,我们了解到:使用yieldreturn返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元素,是一种"按需供给"。本篇来重温yieldreturn的用法,探秘yield背后的故事并自定义一个能达到yieldreturn相同效果的类,最后体验yieldbreak的用......
  • CVE-2023-2825-GitLab目录穿越poc
    GitlabCVE-2023-2825目录穿越漏洞前言昨天GitLab出了一个版本目录穿越漏洞(CVE-2023-2825),可以任意读取文件。当时我进行了黑盒测试并复现了该漏洞。“Anunauthenticatedmalicioususercanuseapathtraversalvulnerabilitytoreadarbitraryfilesontheserver......
  • cpufreq的初始化讲解
    cpufreq初始化cpufreq的初始化,通过调用cpufreq_register_driver接口,完成一系列的policy、governor和driver配置。驱动moduleinit入口driver编写module_init的函数,在初始化中使用cpufreq_register_driver注册驱动cpufreq_register_driver中会完成增加总线设备、节点创建等操......