【问题标题】:Use of lock keywork c#使用lock关键字c#
【发布时间】:2016-11-05 19:13:52
【问题描述】:

我正在使用此代码进行 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. 将打印“安全”。

我以为会发生死锁,但是当我运行代码时会打印“安全”。

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

谢谢!

【问题讨论】:

  • 这个程序只有一个线程,主线程,同步资源被访问了两次,但是是同一个线程,所以不会出现死锁的情况。
  • 运行程序,看看它会打印什么:这是你的作业,不是吗?顺便说一句,它将打印“安全”

标签: c# multithreading locking


【解决方案1】:

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

示例:

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

Thread A锁定 List AThread A 想从List B 中获取价值

Thread B锁定 List BThread B 想从List A 中获取价值

现在Threads 都将尝试获取它们之间锁定的资源。

【讨论】:

    【解决方案2】:

    你的程序是单线程的,所以它是线程安全的默认情况下(有一个死锁竞态条件 em> 等。你必须至少有 两个 线程)。任何locks 实际上什么都不做——没有其他线程可以锁定(这就是为什么所有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()
    • 等待 1 秒
    • 打印出"Safe"

    【讨论】:

      【解决方案3】:

      关键字lock用于限制某个资源被其他线程访问。由于您的应用程序没有使用多线程,因此不可能发生死锁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        • 2013-02-08
        • 1970-01-01
        相关资源
        最近更新 更多