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