都快把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
;
}
}
}
|
再运行你就不会看到 有问题了
本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/archive/2012/12/11/2812334.html,如需转载请自行联系原作者