原来C#.Net的Lock锁机制是这样的

363 阅读1分钟

一:Lock概念

Lock锁的基础语法是:

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

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

二:代码讲解

   /// <summary>
    /// 锁对象
    /// </summary>
    private static object obj = new object();

    /// <summary>
    /// 执行方法
    /// </summary>
    /// <returns></returns>
    [HttpGet()]
    public string Get()
    {
        A();//先调用A方法
        B();//再调用B方法
        
        return "value";
    }

我在这里定义了一个接口,来分别调用A、B两个方法

1、没加Lock锁情况:

    public static void A()
    {
        Task.Run(() =>
           {
               for (int i = 1; i <= 25; i++)
               {
                   Console.WriteLine("我是A方法循环第:" + i + "遍");
               }
           });

        Console.WriteLine();
    }

    public static void B()
    {
        Task.Run(() =>
        {
            for (int i = 1; i <= 25; i++)
            {
                Console.WriteLine("我是B方法循环第:" + i + "遍");
            }
        });

        Console.WriteLine();
    }

image.png

如上,这是没有加Lock锁的情况,A、B两个方法的内容因为多线程原因,数据已经开始错乱!

2、加上Lock锁情况:

    public static void A()
    {
        lock (obj)
        {
            Task.Run(() =>
            {
                for (int i = 1; i <= 25; i++)
                {
                    Console.WriteLine("我是A方法循环第:" + i + "遍");
                }
            });
        }

        Console.WriteLine();
    }

    public static void B()
    {
        lock (obj)
        {
            Task.Run(() =>
            {
                for (int i = 1; i <= 25; i++)
                {
                    Console.WriteLine("我是B方法循环第:" + i + "遍");
                }
            });
        }
        Console.WriteLine();
    }

image.png

如上:加上Lock锁的话,他是按照我们的理想顺序先执行A,再执行B方法!

可能在此,大家看不出来什么异常,但是在我们日常工作中,线程几十个上百个的话,同时访问一个数据库中的某个表,那么大家可想而知会遇到什么麻烦,数据库锁死等等!!

好了今天的分享到这里就结束了,大家有什么更好的技术,欢迎到评论区讨论!!!