首页 > 编程语言 >C# Lock 实例锁和静态锁区别

C# Lock 实例锁和静态锁区别

时间:2023-10-30 12:12:26浏览次数:33  
标签:SharedResource C# Lock counter 静态 实例 线程 IncrementCounter2

Lock 实例锁和静态锁区别

public class SharedResource
    {
        private readonly object lockObject = new object();

        private readonly static object lockstaticObject = new object();
        static int counter = 0;

        public int IncrementCounter()
        {
            lock (lockObject)
            {
                Console.WriteLine(counter.ToString());
                counter++;
                return counter;
            }
        }
        public int IncrementCounter2()
        {
            lock (lockstaticObject)
            {
                Console.WriteLine(counter.ToString());
                counter++;
                return counter;
            }
        }
    }
    internal class Program
    {

        static void Main(string[] args)
        {
            List<Task> tasks = new List<Task>();
            for (int i = 0; i < 20; i++)
            {
                tasks.Add(
                        Task.Run(() =>
                        {
                            new SharedResource().IncrementCounter2();
                        })
                );
            }

            Task.WhenAll(tasks).Wait();

        }

这段代码中的 IncrementCounterIncrementCounter2 两个方法都用于增加 counter 变量的值,并在每次增加后返回新的值。它们的主要区别在于用于同步的锁对象:

  1. IncrementCounter 方法使用一个实例锁对象 lockObject。这意味着每次只有一个线程可以访问此方法。如果有其他线程试图同时访问此方法,它们将会被阻塞,直到当前线程完成此方法的执行。
  2. IncrementCounter2 方法使用一个静态锁对象 lockstaticObject。这意味着每次只有一个线程可以访问此静态方法,无论有多少实例。如果有其他线程试图同时访问此方法,它们将会被阻塞,直到当前线程完成此方法的执行。

使用实例锁和静态锁的区别在于,实例锁只锁当前实例,而静态锁会锁整个类型。因此,如果你创建了多个 SharedResource 实例,每个实例都有自己的 lockObject,所以它们不会相互阻塞。然而,对于 IncrementCounter2,由于它使用的是静态锁,所以即使你创建了多个 SharedResource 实例,其他线程试图访问任何实例的 IncrementCounter2 方法时都会被阻塞,直到第一个线程完成执行。

总结:静态锁的所范围很大。再合适的场景要使用不同的锁

标签:SharedResource,C#,Lock,counter,静态,实例,线程,IncrementCounter2
From: https://www.cnblogs.com/kkbk/p/17797498.html

相关文章

  • Git报错“no branch, rebasing master”
    本次出现这个错误是因为本地提交了commit但是未push成功,所以使用gitpull--rebase,由于远程仓库和本地的commit有冲突,Git无法自动解决冲突时,会切换到一个匿名分支,然后使用gitbranch发现报错“nobranch,rebasingmaster”。解决办法:在当前匿名分支下,解决完冲突,然后使用命令git......
  • Docker Swarm 节点维护
    DockerSwarmModeDockerSwarm集群搭建DockerSwarm节点维护DockerService创建1.角色转换Swarm集群中节点的角色只有manager与worker,所以其角色也只是在manager与worker间的转换。即worker升级为manager,或manager降级为worker。1.1worker升级为manager在manag......
  • Docker Service 创建
    DockerSwarmModeDockerSwarm集群搭建DockerSwarm节点维护DockerService创建service只能依附于dockerswarm集群,所以service的创建前提是,swarm集群搭建完毕。1.创建servicedockerservicecreate命令用于创建service,需要在manager中运行。与创建容器的命令dock......
  • 解决MYSQL查询报错 Expression #4 of SELECT list is not in GROUP BY clause and con
    原因:在MySQL5.7.5后,默认开启了ONLY_FULL_GROUP_BY,所以导致了之前的一些SQL无法正常执行,其实,是我们的SQL不规范造成的,因为groupby之后,返回的一些数据是不确定的,所以才会出现这个错误。执行下面的命令后,重启你的代码,就可以了selectversion(),@@sql_mode;SETsql_mode=(SELECTRE......
  • 《ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践》
    计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。如今,我们正在见证人工智能技术的突破性发展。以OpenAI的ChatGPT为代表的人工智能技术,使......
  • CVer从0入门NLP(一)———词向量与RNN模型
    ......
  • 编译报错 internal compiler error: Segmentation fault 解决方法
    问题描述最近在使用虚拟机ubuntu20.04编译muslgcc工具链时,遇到一个奇怪的问题,编译过程中异常退出,清理了多次重新编译,发现编译报错提示的信息是internalcompilererror:Segmentationfault由于之前是可以正常编译的,所以怀疑编译环境造成的解决方法初步重启ubuntu可以解决......
  • OpenGlobe之ShaderObjectGL3x
    该类只有一个私有成员变量_shaderObjectprivateint_shaderObject;这是用来存放地址?初始化:_shaderObject=GL.CreateShader(shaderType);接着,为_shaderObject添加shader源文件:GL.ShaderSource(_shaderObject,sources.Length,sources,lengthPointer);接着,为_sha......
  • 实例教程:如何在应用中集成美狐直播美颜SDK
    随着直播和视频应用的兴起,用户对于视频质量和外貌自然度的要求越来越高。为了满足这一需求,开发者们可以通过集成直播美颜SDK来提供更吸引人的视频体验。本文将为您提供一个实例教程,以演示如何在您的应用中成功集成直播美颜SDK。无论您是一个有经验的开发者还是初学者,这个教程都将引......
  • Codeforces Round 906 (Div. 2) A-E1
    比赛地址A.Doremy'sPaint3题意:给出一个数组\(b\),问能否通过重新排序使得数组满足\(b_1+b_2=b_2+b_3=...=b_{n-1}+b_{n}\)Solution首先判断元素个数如果是1,则满足条件如果是2,需判断不同元素个数的差是否小于等于1其余的均不满足条件voidsolve(){intn;cin>......