lock小记

时间:2022-04-25
本文章向大家介绍lock小记,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

都快把lock忘了用wcf 给手持设备做服务的时候可能会有并发操作但又忘了lock的使用情况

做个小例子,怕自己再忘了

不加lock的时候 结果可能 是负的下面有图,我们设想 的是不会有负数,

但是多个线程访问的时候就会出现这个问题,一个线程在访问的时候别其它的线程也在访问DoFun这个方法

就会出现错误就想办法让一个线程在处理DoFun的时候别的线程等待

        static int myIndex = 50;
        static int MyMinus = 100;
        static object objLock = new object();
        static void Main(string[] args)
        {
            #region
            Thread _thread ;
            while (myIndex>0)
            {               
                try
                {
                    _thread = new Thread(new ParameterizedThreadStart(DoFun));
                    _thread.Start((object)myIndex--);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("程序错误!");
                    return;
                }
            }
            Console.ReadLine();
            #endregion

        }
        public static void DoFun(object s)
        {
            if (MyMinus < 0)
            {
                throw new Exception("NegativeNo");
            }


            if (MyMinus > (int)s)
            {
                Thread.Sleep(500);
                MyMinus = MyMinus - (int)s;
                Console.WriteLine("Console:" + MyMinus.ToString());
            }
            else
            {
                Console.WriteLine("no!!!!");
                return;
            }


        }

于是乎就用到 了lock我们用它把DoFun改写一下吧不过要注意死锁问题,

大家可以看一下msdn是怎么说的

        public static void DoFun(object s)
        {
            if (MyMinus < 0)
            {
                throw new Exception("NegativeNo");
            }

            lock (objLock)
            {
                if (MyMinus > (int)s)
                {
                    Thread.Sleep(500);
                    MyMinus = MyMinus - (int)s;
                    Console.WriteLine("Console:" + MyMinus.ToString());
                }
                else
                {
                    Console.WriteLine("no!!!!");
                    return;
                }
            }

        }

  再运行你就不会看到 有问题了