C# 锁匙的使用#

C# 锁匙的使用#,c#,multithreading,locking,C#,Multithreading,Locking,我正在使用以下代码进行C#编码练习: class Program { static object sync = new object(); static void SafeRun() { lock (sync) { Thread.Sleep(1000); } } static void Main(string[] args) { lock (sy

我正在使用以下代码进行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");
     }
   }
}
将打印什么

  • 如果没有,则会发生死锁
  • 它不编译
  • “安全”将打印出来
  • 我原以为会发生死锁,但当我运行代码时,会打印“Safe”

    那么,你能解释为什么3是正确的,为什么1是不正确的吗

    谢谢大家!

    您的程序是单线程的,因此默认情况下它是线程安全的(要有死锁、争用条件等,您必须至少有两个线程)。任何
    lock
    s实际上什么都不做-没有其他线程可以锁定(这就是为什么所有
    lock
    都可以被删除)

    你只是

    • 开始
    • 调用
      SafeRun()
    • 等一秒钟
    • 打印出“安全”

    要发生
    死锁
    ,至少需要两个线程来访问它们之间锁定的资源

    示例:

    您有2个正在运行的
    线程
    和2个
    列表

    线程A
    锁定
    列表A
    线程A
    希望从
    列表B

    线程B
    锁定
    列表B
    线程B
    希望从
    列表A中获取值


    现在,两个
    线程将尝试获取它们之间锁定的资源。

    关键字
    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
        }
    }