前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lock小记

lock小记

作者头像
lpxxn
发布2018-01-31 10:49:44
6140
发布2018-01-31 10:49:44
举报
文章被收录于专栏:技术之路

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

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

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

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

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

代码语言:javascript
复制
        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是怎么说的

代码语言:javascript
复制
        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;
                }
            }

        }

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-12-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档