线程二(Monitor)
Monitor 类的命名空间是 System.Threading,它的用法和 lock 本质是一样的。
使用 Monitor 类锁定资源的代码如下。
Monitor.Enter(object);
try
{
//临界区代码
}
finally
{
Monitor.Exit(object);
}
在这里,object 值与 lock 中的 object 值是一样的。
简而言之,lock 的写法是 Monitor 类的一种简写。
public void PrintOdd1()
{
try
{
Monitor.Enter(obj);
for (int i = 1; i <= 100; i += 2)
{
WriteLine(i);
}
}
catch (Exception)
{
throw;
}
finally
{
Monitor.Exit(obj);
}
}
public void PrintEven1()
{
try
{
Monitor.Enter(obj);
for (int i = 2; i <= 100; i += 2)
{
WriteLine(i);
}
}
catch (Exception)
{
throw;
}
finally
{
Monitor.Exit(obj);
}
}
Program program = new Program();
Thread t1 = new Thread(program.PrintOdd1);
t1.Start();
Thread t2 = new Thread(program.PrintEven1);
t2.Start();
另一个购票的例子:
private object obj = new object();
private static int ticketsNum = 100;
public void BuyTickets1()
{
try
{
Monitor.Enter(obj);
if (ticketsNum > 0)
{
ticketsNum -= 1;
WriteLine("Thread1, 购1,剩" + ticketsNum);
}
else
{
WriteLine("Thread1, 没票了");
}
}
catch (Exception)
{
throw;
}
finally
{
Monitor.Exit(obj);
}
}
public void BuyTickets2()
{
try
{
Monitor.Enter(obj);
if (ticketsNum > 0)
{
ticketsNum -= 1;
WriteLine("Thread2, 购1,剩" + ticketsNum);
}
else
{
WriteLine("Thread2, 没票了");
}
}
catch (Exception)
{
throw;
}
finally
{
Monitor.Exit(obj);
}
}
static void Main(...)
{
while (ticketsNum > 0)
{
Program program = new Program();
Thread t1 = new Thread(program.BuyTickets1);
t1.Start();
Thread t2 = new Thread(program.BuyTickets2);
t2.Start();
}
}
以上模拟两个人购票,一个人购票时限制另一个人购票,同步更新剩余的票数。
Monitor 类的用法虽然比 lock 关键字复杂,但其能添加等待获得锁定的超时值,这样就不会无限期等待获得对象锁。
使用 TryEnter() 方法可以给它传送一个超时值,决定等待获得对象锁的最长时间。
使用 TryEnter() 方法设置获得对象锁的时间的代码如下。
Monitor.TryEnter(object, 毫秒数 );
该方法能在指定的毫秒数内结束线程,这样能避免线程之间的死锁现象。
此外,还能使用 Monitor 类中的 Wait() 方法让线程等待一定的时间,使用 Pulse() 方法通知处于等待状态的线程。
http://c.biancheng.net/view/3000.html
线程二(Monitor)的更多相关文章
- C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)
C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...
- 【Qt开发】事件循环与线程 二
事件循环与线程 二 Qt 线程类 Qt对线程的支持已经有很多年了(发布于2000年九月22日的Qt2.2引入了QThread类),Qt 4.0版本的release则对其所有所支持平台默认地是对多线程支 ...
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- Java线程(二):线程同步synchronized和volatile
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...
- C#中的线程二(BeginInvoke和Invoke)
近日,被Control的Invoke和BeginInvoke搞的头大,就查了些相关的资料,整理如下.感谢这篇文章对我的理解Invoke和BeginInvoke的真正含义 . (一)Control的In ...
- java 线程二
一.线程的优先级别 线程优先级别的使用范例: 1 package cn.galc.test; 2 3 public class TestThread6 { 4 public static void m ...
- java基础学习总结——线程(二)
一.线程的优先级别
- java基础—线程(二)
一.线程的优先级别
- 第二十篇 .NET高级技术之C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
随机推荐
- seekBar拖动滑块
中秋节学习,, 通过拖动滑块,改变图片的透明度 <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- FrameLayout--霓虹灯
主函数里面,新建一个线程,控制改变背景色 package com.example.framelayout import android.support.v7.app.AppCompatActivity ...
- Python的开源人脸识别库:离线识别率高达99.38%(附源码)
Python的开源人脸识别库:离线识别率高达99.38%(附源码) 转https://cloud.tencent.com/developer/article/1359073 11.11 智慧上云 ...
- ionic生命周期函数
Ionic4中的生命周期函数和angualr7基本是一样的,下面我们看看Ionic4中的生命周期函数,以及生命周期函数的用法. Ionic4中内置的生命周期函数: ionViewWillEnter — ...
- Selenium踩坑记之iFrame的定位与切换
转自:https://www.jianshu.com/p/6e7d0359e4bb Selenium是浏览器自动化测试的工具之一,用过的人都懂他的好,也被他坑的不要不要的.今天就聊聊Selenium的 ...
- Spring cloud微服务安全实战-3-9API安全机制之审计日志
首先说一下审计日志的处理.审计日志处理的位置,应该是在认证之后,授权之前.因为只有你在认证之后,你才能知道这个请求到底是谁发出来的,谁在做这个事情.在这个授权之前,这样的话那些被拒绝掉的请求.在响应的 ...
- Qt编写自定义控件66-光晕时钟
一.前言 在上一篇文章写了个高仿WIN10系统的光晕日历,这次来绘制一个光晕的时钟,也是在某些网页上看到的效果,时分秒分别以进度条的形式来绘制,而且这个进度条带有光晕效果,中间的日期时间文字也是光晕效 ...
- Linux记录-Shell自动化部署批量建立用户和批量SSH配置(转载)
if [ ! $# -eq 2 ] ; then echo "请输入用户名和密码以空格分开!" exit else name="$1" passwd=" ...
- python 判断文件是否存在和删除文件的api (其中判断文件在不在让想起这个可以强兼容jenkins工作目录那个问题)
判断文件在不在的api: os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作. os.path模块主要用于文件的属性获取,exists是“存在” ...
- Linux系统调优——系统整体运行状态排查(七)
(1).vmstat vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的整体状态值,包括服务器的CPU使用率,MEM内存使用,VMSwap虚拟内存交换情况,IO读写 ...