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;
                }
            }

        }

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

ASP.NET通过http/https的POST方式,发送和接受XML文件内容

 本文转载:http://hi.baidu.com/ysyhyt/item/5011ae39ce3cf49fb80c0395

3781
来自专栏LIN_ZONE

Laravel使用Form(转载)

laravel到了5.1.*以上版本,便没有了illuminate/html类库的支持,

752
来自专栏逸鹏说道

Email系列(QQ邮箱 + 含附件的邮箱案例 + 项目实战)上

平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html 邮箱系列:https...

3085
来自专栏偏前端工程师的驿站

GridView实战一:自定义分页、排序、修改、插入、删除

前言:   在某次公司面试时被问到对GridView操作的熟悉程度,在那之前一直用Repeater内嵌table标签对GridView操作确实很少,于是最近在项...

37210
来自专栏GreenLeaves

WCF系列教程之WCF客户端异常处理

本文参考自:http://www.cnblogs.com/wangweimutou/p/4414393.html,纯属读书笔记,加深记忆 一、简介 当我们打开W...

2046
来自专栏木宛城主

SharePoint下用C#代码上传文档至文档库的子文件夹中

SharePoint的文档库非常方便,可以管理日常的文档,更强大的是可以创建文件夹来分类,通常在UI界面上是非常简单了,点击文件夹,Create a Fold...

2148
来自专栏Porschev[钟慰]的专栏

Asp.Net开发等级星使用(Jquery Rating)

插件参数: rater第一个参数是AJAX提交的URL rater第二个参数 maxvalue:最大星数 curvalue:默认选择多少颗星 title:鼠标放...

2317
来自专栏跟着阿笨一起玩NET

DataTable.Select 返回DataTable

在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地...

891
来自专栏Porschev[钟慰]的专栏

Asp.Net无刷新分页( jquery.pagination.js)

采用Jquery无刷新分页插件jquery.pagination.js 实现无刷新分页效果 友情提示:本示例Handler中采用StringBuilder的ap...

2609
来自专栏阿炬.NET

登陆后设置cookie的方法

3417

扫码关注云+社区

领取腾讯云代金券