都快把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; } } }
再运行你就不会看到 有问题了