lock小记

简介: 都快把lock忘了用wcf 给手持设备做服务的时候可能会有并发操作但又忘了lock的使用情况 做个小例子,怕自己再忘了 不加lock的时候 结果可能 是负的下面有图,我们设想 的是不会有负数, 但是多个线程访问的时候就会出现这个问题,一个线程在访问的时候别其它的线程也在访问DoFun这个方法 ...

都快把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;
                }
            }

        }

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

目录
相关文章
|
3月前
|
安全 C++
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
C++标准库中的锁lock_guard、unique_lock、shared_lock、scoped_lock、recursive_mutex
33 0
|
3月前
lock_guard和unique_lock
lock_guard和unique_lock
|
4月前
|
C++
[C++] 互斥锁(unique_lock、lock_guard)
[C++] 互斥锁(unique_lock、lock_guard)
35 0
|
6月前
|
Java
lock和synchtonized的区别
lock和synchtonized的区别
|
API 数据安全/隐私保护
Lock锁
Lock锁
123 0
Lock锁
|
Java API