天天看點

《C#多線程程式設計實戰(原書第2版)》——1.11 使用Monitor類鎖定資源

本節書摘來自華章出版社《c#多線程程式設計實戰(原書第2版)》一書中的第1章,第1.11節,作者(美)易格恩·阿格佛溫(eugene agafonov),黃博文 黃輝蘭 譯,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

本節示範了另一個常見的多線程錯誤,被稱為死鎖(deadlock)。由于死鎖将導緻程式停止工作,以下例子中的第一部分使用了新的monitor類來避免死鎖。之前描述過的lock關鍵字則用于建立死鎖。

為了學習本節,你需要安裝visual studio 2015。除此之外無需其他準備。本節的源代碼放置在booksampleschapter1recipe10目錄中。

請執行以下步驟來了解多線程中的死鎖情況:

1.啟動visual studio 2015。建立一個c#控制台應用程式項目。

2.在program.cs檔案中加入以下using指令:

《C#多線程程式設計實戰(原書第2版)》——1.11 使用Monitor類鎖定資源

3.在main方法下面加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——1.11 使用Monitor類鎖定資源

4.在main方法中加入以下代碼片段:

《C#多線程程式設計實戰(原書第2版)》——1.11 使用Monitor類鎖定資源

5.運作程式。

先看看locktoomuch方法。在該方法中我們先鎖定了第一個對象,等待一秒後鎖定了第二個對象。然後在另一個線程中啟動該方法。最後嘗試在主線程中先後鎖定第二個和第一個對象。

如果像該示例的第二部分一樣使用lock關鍵字,将會造成死鎖。第一個線程保持對lock1對象的鎖定,等待直到lock2對象被釋放。主線程保持對lock2對象的鎖定并等待直到lock1對象被釋放,但lock1對象永遠不會被釋放。

實際上lock關鍵字是monitor類用例的一個文法糖。如果我們分解使用了lock關鍵字的代碼,将會看到它如下面代碼片段所示:

《C#多線程程式設計實戰(原書第2版)》——1.11 使用Monitor類鎖定資源

是以,我們可以直接使用monitor類。其擁有tryenter方法,該方法接受一個逾時參數。如果在我們能夠擷取被lock保護的資源之前,逾時參數過期,則該方法會傳回false。