如果两个或多个线程访问相同的对象,或者访问不同步的共享状态,就会出现竟态条件。
在单核的CPU中,若线程调度是抢先式的,就会出现此问题;在多CPU或双核CPU系统中,其多个线程可以同时运行,竟态条件这个问题会比单核CPU系统中较多。
Example:
public class StateObject{
int state=5;
//避免竟态条件的第二种方法是将共享对象设为线程安全的对象。
Object sync= new Object();
public void ChangeState(int loop)
{
lock(sync)
{
if(state==5)
{
state++;
Trace.Assert(state==6,"Race Condition occurred after"+loop+" loops");
}
state=5;
}
}
}
public class SampleThread
{
public void RaceCondtion(object o)
{
StateObject so= o as StateObject;
int i=0;
while(true)
{
lock(so)//锁定共享对象,可以避免竟态条件发生
{
so.ChangeState(i++);
}
}
}
}
public static class MainCllass
{
static void Main()
{
StateObject o = new StateObject();
for(int i=0;i<20;i++)
{
new thread(new SampleThread().RaceCondtion)).start(o);
}
}
}