开发者社区> 华章计算机> 正文

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

简介:
+关注继续查看

本节书摘来自华章出版社《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指令:


66d2bcd925b390a1b2bf92b6ed165b119097c745

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


6aca33aacf5aa1797e28c4750cfc63bacfc042a9

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


05b18737fd1c57b5249042b3704a5a9b9e8c3178

5.运行程序。

1.11.3 工作原理

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

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

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


fcefe7cc6b19b778968c4e9a95380f698bd0e113

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#多线程编程系列(二)- 线程基础
原文:C#多线程编程系列(二)- 线程基础 目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 1.9 向线程传递参数 1.10 C# Lock关键字的使用 1.11 使用Monitor类锁定资源 1.12 多线程中处理异常 参考书籍 笔者水平有限,如果错误欢迎各位批评指正! C#多线程编程系列(二)- 线程基础 1.1 简介 线程基础主要包括线程创建、挂起、等待和终止线程。
925 0
Ionic 入门与实战之第一章:Ionic 介绍与相关学习资源
原文发表于我的技术博客 本文是「Ionic 入门与实战」系列连载的第一章,主要对 Ionic 的概念、发展历程、适配的移动平台等知识进行了介绍,并分享了 Ionic 相关的学习资源。原文发表于我的技术博客 1. Ionic 简介 在前端技术发展越来越快的今天,Hybrid App 开发技术也受到了很大的影响。
1395 0
多线程编程学习四(Lock 的使用)
一、前言     本文要介绍使用Java5中 Lock 对象,同样也能实现同步的效果,而且在使用上更加方便、灵活,主要包括 ReentrantLock 类的使用和ReentrantReadWriteLock 类的使用。
847 0
C#多线程编程系列(四)- 使用线程池
原文:C#多线程编程系列(四)- 使用线程池 目录 1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 使用BackgroundWorker组件 参考书籍 笔者水平有限,如果错误欢迎各位批评指正! 1.1 简介 在本章中,主要介绍线程池(ThreadPool)的使用;在C#中它叫System.Threading.ThreadPool,在使用线程池之前首先我们得明白一个问题,那就是为什么要使用线程池。
878 0
C#多线程编程(整理)
Donet基础类库的System.Threading命名空间提供了大量的类和接口支持多线程。这个命名空间有很多的类,下面是Thread的资料。System.Threading.Thread类是用来创建并控制线程,设置其优先级并获取其状态最为常用的类。
930 0
多线程编程
多线程编程需要引用threading包 import threadingclass mythread(threading.Thread): def __init__(self,num):  threading.
422 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载