关于lock的问题~ 如果线程1正在运行lock(obj){}内的代码,这时候线程2调用一个obj的方法,线程2会被sleep么?还是说如果想在此时令线程2sleep,必须要为线程2调用的obj的方法加上lock? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 lock(obj){}是保证在同一时间内只有一个线程在此范围内运行这时候线程2调用一个obj的方法,线程2会被sleep么?--------------------------------------------------不是,这个和obj的方法无关还是说如果想在此时令线程2 sleep,必须要为线程2调用的obj的方法加上lock--------------------------------------------------理解错误如果有一线程在lock范围内执行,那么另一线程只有等第一个线程从lock返回内出来才可以执行lock内的程序 也就是说即使为线程2调用的obj的方法(如obj.a())上lock(obj)也不能起到sleep的作用了?那如果我想实现:只要线程1正在运行lock(obj){}的代码时,线程2调用obj.a()就sleep,直到线程1释放obj。要如何做呢? lock(obj){ obj.a();} 我认为应该这样理解的:obj在lock时,应该抽象为“互斥对象”,“临界资源”,等同于一把锁,一扇门。lock(obj) //在这里把门给锁上了{..... //只有进门的线程可以执行这些代码,门外的线程必须等候}..... //在这里门开了,可以放进另一个等候的线程进来执行。所以,通常object objSync = new object(); //声明这把锁,而不关心objSync是属于哪个类的,有哪些方法。 不会,必须lock(obj),所有引用obj的地方都必须lock(obj)才可以串行化访问 谢谢楼上大侠们的回复~顶楼的问题已经解释的很清楚了~~现在的问题是:如果线程1正在运行任意obj的方法(如obj.a()),那么任何其他线程都禁止访问obj的任何方法,怎么做呢?我能想到的就是在每一个方法开始和结束的时候加个bool的变量判断,如:bool objFree = true;void a(){ while (!objFree) { Thread.Sleep(100); } objFree = false; /******* Do something *******/ objFree = true;}将所有obj类的方法都写成上述格式,请问还有更好的办法么? 采用一个ManualResetEvent对象A。每个操作之前都做A.WaitOne,如果返回false,说明别的地方在使用A,函数返回。如果返回是true,那么执行A.Set,随后开始操作你的obj。操作完之后记得要A.Reset。请格外注意你的操作可能会引发异常,那么要用try finally保证Reset发生。而A的作用域最好和obj一致,这样可以保证A可以随时保护obj。 用clickonce将应用程序发布到ftp时,安装URL应该怎么填? 基类如何取得子类的属性? 如何获取命名管道的名称? 怎样将剪贴板内容粘贴下来 访问第三方Oracle数据库的问题?在线等,请指教!! dataset最多可以存放多少条数据? 金山词霸大家都用过吧? 请叫他的按钮效果是如何实现的?用C#能做到吗? 关于FileStream MouseMove事件为何这么[迟钝]? 请问任何用WMI获取安装程序列表~~~ class数组的问题 C#中byte[]转换成Image
这时候线程2调用一个obj的方法,线程2会被sleep么?
--------------------------------------------------
不是,这个和obj的方法无关
还是说如果想在此时令线程2 sleep,必须要为线程2调用的obj的方法加上lock
--------------------------------------------------
理解错误如果有一线程在lock范围内执行,那么另一线程只有等第一个线程从lock返回内出来才可以执行lock内的程序
只要线程1正在运行lock(obj){}的代码时,线程2调用obj.a()就sleep,直到线程1释放obj。
要如何做呢?
{
obj.a();
}
{
..... //只有进门的线程可以执行这些代码,门外的线程必须等候
}
..... //在这里门开了,可以放进另一个等候的线程进来执行。
所以,通常
object objSync = new object(); //声明这把锁,而不关心objSync是属于哪个类的,有哪些方法。
void a()
{
while (!objFree)
{
Thread.Sleep(100);
}
objFree = false; /******* Do something *******/ objFree = true;
}将所有obj类的方法都写成上述格式,请问还有更好的办法么?