C# lock关键字

lock 简单的说是在一个线程进入代码段的时候防止其他的线程进入,语法如下:

lock(expression)

{

     代码段;

}

这个很简单了,像lock(this), lock(obj)  我们都很常见.

问题来了,Lock后面括号里的内容是什么?他跟要被锁定的代码段有什么关系?

归纳的说是:lock 锁住了一个代码段, expression 表示的是代码段是谁的 。

不要咬文嚼字,所谓代码段是谁的其实没有太多的实际意义,可以直接翻译成:

当2个线程的代码执行到此处,如果2个线程的 expression指向同一个引用,就能锁住,否则锁不住.

假设我们是这样调用的 :

protected void Page_Load(object sender, EventArgs e)
{
Class1 c = new Class1();

Thread t = new Thread( c.f);
Thread t1 = new Thread(c.f);

t.Start();
t1.Start();
}

下面这样lock就锁不住,因为 o 指向不同的引用:

    public class Class1
{
public void f()
{
object o = new object();
lock(o)
{
for (int k = 0; k < 1000; )
{
k++;
}
}
}
}


下面这样调用就能锁住:

    public class Class1
{
object o = new object();
public void f()
{
lock(o)
{
for (int k = 0; k < 1000; )
{
k++;
}
}
}
}



posted @ 2012-01-20 15:26  非常苹果  阅读(393)  评论(0编辑  收藏  举报