使用锁定键功能c#

时间:2016-11-05 19:13:52

标签: 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 (sync)
         {
              SafeRun();
         }

         Console.Write("Safe");
     }
   }
}

会打印什么?

  1. 没什么,发生了僵局。
  2. 无法编译。
  3. "安全"将打印。
  4. 我认为会发生死锁,但是当我运行代码时#34; Safe"打印出来。

    那么,你能解释一下为什么3是正确的以及为什么1不正确?

    谢谢!

3 个答案:

答案 0 :(得分:3)

要发生deadlock,您至少需要2个线程才能访问它们之间锁定的资源。

示例:

您有2个正在运行Thread和2个List<T>

Thread A 已锁定 List AThread A想要从List B

获取值

Thread B 已锁定 List BThread 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用于限制某些资源被其他线程访问。由于您的应用程序不使用多个线程,因此不可能发生死锁。