我正在使用此代码进行C#编码练习:
class Program
{
static object sync = new object();
static void SafeRun()
{
lock (sync)
{
Thread.Sleep(1000);
}
}
static void Main(string[] args)
{
lock (sync)
{
SafeRun();
}
Console.Write("Safe");
}
}
}
会打印什么?
我认为会发生死锁,但是当我运行代码时#34; Safe"打印出来。
那么,你能解释一下为什么3是正确的以及为什么1不正确?
谢谢!
答案 0 :(得分:3)
要发生deadlock
,您至少需要2个线程才能访问它们之间锁定的资源。
示例:强>
您有2个正在运行Thread
和2个List<T>
。
Thread A
已锁定 List A
。 Thread A
想要从List B
Thread B
已锁定 List B
。 Thread B
想要从List A
现在两个Threads
都会尝试获取锁定在它们之间的资源。
答案 1 :(得分:2)
您的程序是单线程一个,所以默认情况下它是线程安全(具有死锁,竞争条件等等,你必须至少有两个线程。实际上任何lock
都没有做任何事情 - 没有其他线程可以锁定(这就是为什么可以删除所有lock
)。
static void Main(string[] args)
{
lock (sync) // does nothing (no other treads to lock)
{
SafeRun(); // execution
}
Console.Write("Safe"); // printing out
}
static void SafeRun()
{
lock (sync) // does nothing (no other treads to lock)
{
Thread.Sleep(1000); // 1 second pause
}
}
你只是编程
SafeRun()
"Safe"
答案 2 :(得分:1)
关键字lock
用于限制某些资源被其他线程访问。由于您的应用程序不使用多个线程,因此不可能发生死锁。