2016-11-05 51 views
2

我工作的一個C#編碼行使此代碼:使用鎖keywork的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不正確?

謝謝!

+2

在這個程序中只有一個線程正在運行,主線程,同步資源被訪問兩次,但由同一個線程訪問,所以不會出現死鎖情況。 –

+0

運行該程序,看看它會打印什麼:這是你的功課,不是嗎?順便說一句,它會打印「安全」 – CodingYoshi

回答

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()
  • 等待1秒
  • 打印出來"Safe"
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

關鍵字lock用於限制某些資源被其他線程訪問。由於您的應用程序沒有使用多個線程,因此發生死鎖是不可能的。