请教一个关于lock的问题 本帖最后由 walilk 于 2012-10-07 17:41:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这种白痴问题如果你看下MSDN,都可以找到答案:http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则: 如果实例可以被公共访问,将出现 lock (this) 问题。...最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。 简单来说,当外部程序试图lock你的对象实例,并且在块内调用你的这个方法的时候,就会死锁。这个最基本的常识如果都不知道,还是回学校重新学吧。 本帖最后由 caozhy 于 2012-10-07 18:02:30 编辑 @caozhy我看了那篇文章,很受教,只是我还是不太明白单线程递归调用某个函数时的死锁情况,我做了测试也无法制造死锁,代码如下:private Object thisLock = new Object();private void test(int i){ lock (thisLock) { if (i > 10) { Console.WriteLine("i:" + i.ToString()); i--; test(i); } }}----------------private void test(int i){ lock (this) { if (i > 10) { Console.WriteLine("i:" + i.ToString()); i--; test(i); } }}这两段代码都没法产生死锁,请问caozhy能给我一段可以产生死锁的代码么,要递归调用的 @caozhy这位兄台,你测试那段代码了吗??我在开发环境里做了下测试,依然没有死锁产生,事实上a.foo();执行了 单线程的lock没多大意义。更不能造成死锁。造成死锁至少也要两个线程,分别锁两个对象才可能。除非你手动上锁。在你的代码中lock结束时手动再次把对象锁住 Monitor.Enter(this) @haukwong你说的对,确实,我测试了程序,单线程无法lock。想想也是,单线程访问资源,就么必要给资源加锁了 用ADO打开dbf,如何实现两个不同路径下的dbf文件的查询 模版页与内容页 Socket问题 【安装程序问题,如何将文件安装到自定义文件夹】 如何能够知道发短消息的modem正繁忙呢? 怎么显示水晶报表中的每组分页的页码 一个windows应用程序,如何制作安装程序?急!!! 用Reflector反编译出来的结果能否保存为一个项目? 【请教】关于项目中数据库连接关闭以及性能优化问题。 如何设置新窗口始终在其他窗口之上,始终占据焦点 c#基础问题 如何修改和读取app.config文件?网上找的格式和这个都不一样,有劳前辈了!
http://msdn.microsoft.com/zh-cn/library/c5kehkcz.aspx通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
如果实例可以被公共访问,将出现 lock (this) 问题。
...
最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。 简单来说,当外部程序试图lock你的对象实例,并且在块内调用你的这个方法的时候,就会死锁。这个最基本的常识如果都不知道,还是回学校重新学吧。
private Object thisLock = new Object();
private void test(int i)
{
lock (thisLock)
{
if (i > 10)
{
Console.WriteLine("i:" + i.ToString());
i--;
test(i);
}
}
}
----------------
private void test(int i)
{
lock (this)
{
if (i > 10)
{
Console.WriteLine("i:" + i.ToString());
i--;
test(i);
}
}
}这两段代码都没法产生死锁,请问caozhy能给我一段可以产生死锁的代码么,要递归调用的
这位兄台,你测试那段代码了吗??我在开发环境里做了下测试,依然没有死锁产生,事实上a.foo();执行了
更不能造成死锁。造成死锁至少也要两个线程,分别锁两个对象才可能。除非你手动上锁。在你的代码中lock结束时手动再次把对象锁住 Monitor.Enter(this)
想想也是,单线程访问资源,就么必要给资源加锁了