《C#多线程编程实战(原书第2版)》——1.11 使用Monitor类锁定资源

    xiaoxiao2024-04-20  6

    本节书摘来自华章出版社《C#多线程编程实战(原书第2版)》一书中的第1章,第1.11节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    1.11 使用Monitor类锁定资源

    本节演示了另一个常见的多线程错误,被称为死锁(deadlock)。由于死锁将导致程序停止工作,以下例子中的第一部分使用了新的Monitor类来避免死锁。之前描述过的lock关键字则用于创建死锁。

    1.11.1 准备工作

    为了学习本节,你需要安装Visual Studio 2015。除此之外无需其他准备。本节的源代码放置在BookSamplesChapter1Recipe10目录中。

    1.11.2 实现方式

    请执行以下步骤来了解多线程中的死锁情况:

    1.启动Visual Studio 2015。新建一个C#控制台应用程序项目。

    2.在Program.cs文件中加入以下using指令:

    3.在Main方法下面加入以下代码片段:

    4.在Main方法中加入以下代码片段:

    5.运行程序。

    1.11.3 工作原理

    先看看LockTooMuch方法。在该方法中我们先锁定了第一个对象,等待一秒后锁定了第二个对象。然后在另一个线程中启动该方法。最后尝试在主线程中先后锁定第二个和第一个对象。

    如果像该示例的第二部分一样使用lock关键字,将会造成死锁。第一个线程保持对lock1对象的锁定,等待直到lock2对象被释放。主线程保持对lock2对象的锁定并等待直到lock1对象被释放,但lock1对象永远不会被释放。

    实际上lock关键字是Monitor类用例的一个语法糖。如果我们分解使用了lock关键字的代码,将会看到它如下面代码片段所示:

    因此,我们可以直接使用Monitor类。其拥有TryEnter方法,该方法接受一个超时参数。如果在我们能够获取被lock保护的资源之前,超时参数过期,则该方法会返回false。

    相关资源:C#多线程编程实例实战
    最新回复(0)