关于lock的三种情况?
主程序都一样,有三种情况,请问那种情况可以锁住,使B函数在FOO之后运行??为什么?
static void Main(string[] args)
{
A obj = new A();
new Thread((ThreadStart)delegate { obj.Foo(); }).Start();
Thread.Sleep(10);
obj.B();
Console.ReadKey();
}
类A,有三种写法:
第一种:
public class A
{
static object i = 1;
public void Foo()
{
Console.WriteLine("before lock");
lock (i)
{
i = 2;
Console.WriteLine("enter lock and start wait");
Thread.Sleep(10000);
Console.WriteLine("enter lock and wait over");
}
Console.WriteLine("after lock");
}
public void B()
{
lock (i)
{
Console.WriteLine("B called.");
}
}
}
第二种:与第一种的区别是注释掉一行i = 2;
public class A
{
static object i = 1;
public void Foo()
{
Console.WriteLine("before lock");
lock (i)
{
//i = 2;
Console.WriteLine("enter lock and start wait");
Thread.Sleep(10000);
Console.WriteLine("enter lock and wait over");
}
Console.WriteLine("after lock");
}
public void B()
{
lock (i)
{
Console.WriteLine("B called.");
}
}
}
第三种:比第二种又多注释掉一行,lock(i),且锁对象变为this.
public class A
{
static object i = 1;
public void Foo()
{
Console.WriteLine("before lock");
lock (this)
{
//i = 2;
Console.WriteLine("enter lock and start wait");
Thread.Sleep(10000);
Console.WriteLine("enter lock and wait over");
}
Console.WriteLine("after lock");
}
public void B()
{
//lock (this)
{
Console.WriteLine("B called.");
}
}
}