关于LOCK的问题

chat00544 2009-11-09 03:02:37
看到
lock(obj)
{
response.write("sdf");
}
这个语句的意思是response.write("sdf"),在一个时间内只能同一个程序执行,执行完后下个进程才能再使用.
主要是对obj不明白什么意思的,有的也写lock(typeof (类名)),lock(对象名),lock("名字"),这些参数都是什么意思啊.主要有什么作用,麻烦各位大大解释一下,最好有例子.谢谢!
...全文
94 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hide1984 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 chat00544 的回复:]
OK,这个问题解决了,但是怎么锁定一个方法呢?
[/Quote]
lock(obj)
{
//Call your Method;
}
chat00544 2009-11-09
  • 打赏
  • 举报
回复
OK,这个问题解决了,但是怎么锁定一个方法呢?
卧_槽 2009-11-09
  • 打赏
  • 举报
回复
obj只是锁定功能的一个锁定标记。

obj只想某一个内存块。

lock方法检查该内存地址是否已经被记录,如果已经被记录则重新分配cpu时间片。知道该地址使用记录消除。
这样达到了锁定某一功能不被并行执行。

lock(null)
{
}

这样写很有可能会出问题,因为null指向的地址空间在不同的线程中可能会出现差异。那样就达不到lock的效果了。
obj最好是一个静态变量。
static object lockobj=new object();
我一般这么定义。
chat00544 2009-11-09
  • 打赏
  • 举报
回复
如果我只想锁定几行语句是不是可以这样写:
lock(null)
{
语句1;
语句2;
语句3;
}
另外是否能够锁定一个方法,当访问到某一类中的一个Test()方法时,只能有一个进程执行,执行完后另一个进程才能再执行.
chat00544 2009-11-09
  • 打赏
  • 举报
回复
哦,这样就有点明白了,lock(obj){语句}的意思是锁定obj的同时也锁定下面的{语句},只有当obj和语句都执行完了后,下个进程才能执行对吗?
noah1982 2009-11-09
  • 打赏
  • 举报
回复
class Temp
{
private void Test()
{
int test=1;
lock(this)
{
response.write("sdf");
}
}
...........
...........
}

lock(this)--锁定当前类实例
{}
其他线程如果要操作类实例,就被阻塞
object obj = new object();
lock(obj)--锁定obj
{}
其他线程如果要操作obj,就被阻塞

一般不建议lock(typeof (类名)),lock(this),lock("名字"),
lock(typeof (类名))--将锁定类
lock(this)--将锁定当前类实例
lock("名字")--将锁定叫这个名字的声明

而采用
object obj = new object();
lock(obj)--锁定obj
{}
这样锁定的影响只会发生在obj上,而obj是我们专门用来锁定的
wfyloo1981 2009-11-09
  • 打赏
  • 举报
回复
为什么要锁住整个对象啊???
wfyloo1981 2009-11-09
  • 打赏
  • 举报
回复
是执行到lock(this)是对当前对象(this)加锁
response.write("sdf")是加锁之后的操作

不过你这个代码,我不大理解。
你lock是在private方法里,而且是锁住的整个对象,感觉好像没什么意义,
还是等高手解答吧
chat00544 2009-11-09
  • 打赏
  • 举报
回复
有没有大侠来解释一下,小弟不胜感激.
chat00544 2009-11-09
  • 打赏
  • 举报
回复
大概知道什么意思了,不过还不是很明确,比如当前对象:

class Temp
{
private void Test()
{
int test=1;
lock(this)
{
response.write("sdf");
}
}
...........
...........
}
那么其中的线程是执行到response.write("sdf"); 时加锁呢?还是在执行到temp对象是加锁呢?

Hide1984 2009-11-09
  • 打赏
  • 举报
回复
lock一个obj就是将这个obj的synchroot置1, 你可以想象SynchRoot是一个flag,1/0,当obj未被锁定的时候,synchRoot为0,这个时候别的线程进来,首先要check SynchRoot,发现为0,没有被锁定,于是
1。 加锁 Lock (SynchRoot = 1)
2. 执行Lock 内部代码
3. 释放SynchRoot (SynchRoot = 0)

就像Try/Finally一样,
Try中加锁,执行你需要的代码,Finally中释放锁。

楼主可以看看IL,
会被编译成Mointor.Enter/Mointor.Exit.

110,533

社区成员

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

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

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