问题描述
staticboolFlag=false;a=newSystem.Threading.Timer(newTimerCallback(aTim),null,0,20);b=newSystem.Threading.Timer(newTimerCallback(bTim),null,0,20);staticvoidaTim(){if(Flag){Flag=false;}else{Flag=true;}}staticvoidbTim(){Console.WriteLine(Flag?"True":"False");}以上只是个例子,判断静太变量Flag如果保证bTim的输出,也就是线程安全,用lock怎么处理?象下面这样写可以么?StaticobjectLockFlag=newobject();staticvoidaTim(){lock(LockFlag){if(Flag){Flag=false;}else{Flag=true;}}}
解决方案
解决方案二:
什么线程安全,先搞懂了再用这个词儿。
解决方案三:
引用1楼sp1234的回复:
什么线程安全,先搞懂了再用这个词儿。
aTim程序执行过程是不是如下1.判断2.赋值如果在判断结束,但没有赋值的时候,CPU将执行序列分配给bTim,这样,bTim得到的值只是Flag前的面的值,而不是当前的值
解决方案四:
引用2楼ttitt147的回复:
Quote: 引用1楼sp1234的回复:
什么线程安全,先搞懂了再用这个词儿。aTim程序执行过程是不是如下1.判断2.赋值如果在判断结束,但没有赋值的时候,CPU将执行序列分配给bTim,这样,bTim得到的值只是Flag前的面的值,而不是当前的值
钟表一直在走,照这么说,怎么看表都没用了.这个例子应该还不算线程安全问题吧,这个值不停变化,而程序正确读出了对应时间点的值,
解决方案五:
引用3楼zeratul1990的回复:
Quote: 引用2楼ttitt147的回复:
Quote: 引用1楼sp1234的回复:
什么线程安全,先搞懂了再用这个词儿。aTim程序执行过程是不是如下1.判断2.赋值如果在判断结束,但没有赋值的时候,CPU将执行序列分配给bTim,这样,bTim得到的值只是Flag前的面的值,而不是当前的值
钟表一直在走,照这么说,怎么看表都没用了.这个例子应该还不算线程安全问题吧,这个值不停变化,而程序正确读出了对应时间点的值,
每个线程都是定时执行,存不存在CPU在aTim线程没有全部执行完的情况下执行bTim,如果aTim的执行时间大于bTim,那么是不是会出现在aTim刚执行完判断,还未赋值,bTim就开始输出,这样的话,bTim的输出不是我想要的结果,我想要的结果是aTim执行完成后Flag的结果我想要的是当aTim执行时,bTim不判断,只有aTim执行完成,变量也改变后,bTim才执行
解决方案六:
staticvoidaTim(){lock(LockFlag){Flag=!Flag;}}staticvoidbTim(){strings=string.Empty;lock(LockFlag){s=Flag?"True":"False";}Console.WriteLine(s);}
这是你要的效果,给Falg赋值时不能给s赋值,给s赋值时不能给Flag赋值。给这不叫线程安全,叫互斥。
解决方案七:
引用5楼qbilbo的回复:
staticvoidaTim(){lock(LockFlag){Flag=!Flag;}}staticvoidbTim(){strings=string.Empty;lock(LockFlag){s=Flag?"True":"False";}Console.WriteLine(s);}这是你要的效果,给Falg赋值时不能给s赋值,给s赋值时不能给Flag赋值。给这不叫线程安全,叫互斥。
那线程安全又是指哪方面呢?