浪歌 · 随笔 我的开发笔记

【锁】关于lock的使用

[netcore] 2022/6/18 13:53:09

在有并发操作数据(数据库/List/Dictionary/...)等操作时,如果不使用loca锁,会导致数据错误或者异常。

已经出现在系统中 模块自编码 功能中出现(SystemAutoCode)

解决方式:


    class DemoLoca
    {
        private static readonly object _locker = new object();
        private static Dictionary<int, DateTime> dic = new Dictionary<int, DateTime>();
        public static void Demo()
        {
            //方式1 lock
            Parallel.For(0, 100, i =>
            {
                lock (_locker)
                {
                    dic.Add(i, DateTime.Now);
                }
            });
            //方式2 
            Parallel.For(0, 100, i =>
            {
                bool acquiredLock = false;
                try
                {
                    // 3000表示3秒内如果未进入,则返回false
                    Monitor.TryEnter(_locker, 3000, ref acquiredLock);
                    if (acquiredLock == false)
                    {
                        //未获取到锁
                    }
                    else
                    {
                        //获取锁后,可以继续进行
                    }
                }catch(Exception ex)
                {

                }
                finally
                {
                    if (acquiredLock)
                    {
                        //退出锁
                        Monitor.Exit(_locker);
                    }
                }
            });
        }
    }
方式1是方式2的语法糖写法,不过使用Monitor可以设置获取锁的时间,超时则不等待