首页 新闻 会员 周边

多线程锁定静态成员的问题,为什么这段代码没能阻止争用条件的出现

0
悬赏园豆:20 [已解决问题] 解决于 2016-04-28 10:06

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;
}
}
}

青楼满座的主页 青楼满座 | 菜鸟二级 | 园豆:202
提问于:2016-04-27 17:19
< >
分享
最佳答案
0

这个你必须把 Share=5; 放进lock里面,不然有可能 没到 Share=5; 重置 , 等待的线程就进入lock了,自然就不等于6

收获园豆:15
Yu | 专家六级 |园豆:12980 | 2016-04-27 17:35

有道理

青楼满座 | 园豆:202 (菜鸟二级) | 2016-04-28 10:03
其他回答(2)
0

实例方法锁定的是this   lock(this)

静态方法锁定的是typeof(ClassName) 

waiter | 园豆:1000 (小虾三级) | 2016-04-27 17:35
0

if (Share == 5)
{
lock (typeof(ShareData)) 
{
Share++;
Trace.Assert(Share == 6, "出现争用条件");
}
}

你要在lock里面再加判断..或者判断直接加到lock里.

收获园豆:5
吴瑞祥 | 园豆:29449 (高人七级) | 2016-04-27 17:48

谢谢你的回答,虽然没有明白你什么意思

支持(0) 反对(0) 青楼满座 | 园豆:202 (菜鸟二级) | 2016-04-28 10:05

@青楼满座: 对要操作的数据.判断和赋值都要放到lock里面.不然锁是没有意义的.

你先判断是否==5.如果不等于5时才加锁.这时有可能有多个线程已经进入了if中.

要先lock.在lock判断if

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2016-04-28 10:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册