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++;
}
}
}
}