关于用Monitor进行同步的问题!!!!!

v41dugu 2007-04-27 08:19:59
class Program
{
static int i = 11;

static void Fun()
{
Monitor.Enter(i);
i++;
Thread.Sleep(3000);
i++;
Monitor.Exit(i);

}

static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(Fun));
Thread t2 = new Thread(new ThreadStart(Fun));
t1.Start();
t2.Start();
}

}
为什么报错 :从不同步的代码块中调用了对象同步方法???
我这样为什么不对?
我想让两个现成只有1个能改写i
...全文
358 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmsdg 2008-07-17
  • 打赏
  • 举报
回复
using System;
using System.Threading;

class Program
{
static int i = 11;

void Fun()
{
Monitor.Enter(this);
i++;
Thread.Sleep(3000);
i++;
Monitor.Exit(this);

}

static void Main(string[] args)
{
Program myprogram = new Program();
Thread t1 = new Thread(new ThreadStart(myprogram.Fun));
Thread t2 = new Thread(new ThreadStart(myprogram.Fun));
t1.Start();
t2.Start();
}

}
v41dugu 2007-04-27
  • 打赏
  • 举报
回复
楼上的好详细啊 但是如果我就是想保护这个static的值类型怎么办啊?不想让多个线程同时访问它
cby1990 2007-04-27
  • 打赏
  • 举报
回复
使用 Monitor 锁定对象(即引用类型)而不是值类型。将值类型变量传递给 Enter 时,它被装箱为对象。如果再次将相同的变量传递给 Enter,则它被装箱为一个单独对象,而且线程不会阻止。Monitor 本应保护的代码未受保护。此外,将变量传递给 Exit 时,也创建了另一个单独对象。因为传递给 Exit 的对象和传递给 Enter 的对象不同,Monitor 将引发 SynchronizationLockException。有关详细信息,请参见概念性主题 监视器。

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧