所以我试图研究如何使用多线程,我注意到一些我不太明白的东西。
在下一段代码中,看起来 doo() 在 Thread 完成之前开始运行,尽管 foo 与 Thread 相同:
static void Main(string[] args)
{
new Thread(new ThreadStart(foo)).Start();
foo();
doo();
}
public static void foo()
{
Console.WriteLine("1");
Thread.Sleep(3000);
Console.WriteLine("2");
}
public static void doo()
{
Console.WriteLine("do");
}
输出为:
1 //线程
1 //foo
2 //foo
do //doo
2 //线程
假设 doo() 在没有 foo() 的情况下无法开始运行,我们假设最后一个“2”输出来自第一个线程。
这怎么可能?尽管 foo() 和 Thread 具有相同的休眠时间,因为它们是相同的函数,但为什么线程(首先执行)是最后一个完成的线程?
锁定语句
现在,如果我们添加一个 lock 语句,如下所示:
static object syncLock = new object();
static void Main(string[] args)
{
new Thread(new ThreadStart(foo)).Start();
foo();
doo();
}
public static void foo()
{
lock (syncLock)
{
Console.WriteLine("1");
Thread.Sleep(3000);
Console.WriteLine("2");
}
}
public static void doo()
{
Console.WriteLine("do");
}
输出为:
1 //线程
2 //线程
1 //foo
do //doo
2 //线程
现在看起来 doo() 在 foo() 结束之前就开始运行了!这是怎么回事?过程及其背后的逻辑是什么?
小唯快跑啊
开心每一天1111
随时随地看视频慕课网APP
相关分类