public partial class Program
{
public static void Run()
{
for (int i = 0; i < 20; i++)
{
new Thread(new ShareData().RaceCondition).Start();
}
}
}
public class ShareData
{
static int Share = 5;
public void RaceCondition()
{
Console.WriteLine("Thread Id:" + Thread.CurrentThread.ManagedThreadId);
while (true)
{
if (Share == 5)
{
lock (typeof(ShareData))
{
Share++;
Trace.Assert(Share == 6, "出现争用条件");
}
}
Share = 5;
}
}
}
这个你必须把 Share=5; 放进lock里面,不然有可能 没到 Share=5; 重置 , 等待的线程就进入lock了,自然就不等于6
有道理
实例方法锁定的是this lock(this)
静态方法锁定的是typeof(ClassName)
if (Share == 5)
{
lock (typeof(ShareData))
{
Share++;
Trace.Assert(Share == 6, "出现争用条件");
}
}
你要在lock里面再加判断..或者判断直接加到lock里.
谢谢你的回答,虽然没有明白你什么意思
@青楼满座: 对要操作的数据.判断和赋值都要放到lock里面.不然锁是没有意义的.
你先判断是否==5.如果不等于5时才加锁.这时有可能有多个线程已经进入了if中.
要先lock.在lock判断if