关于对C#多线程类Monitor的理解

1、对线程的理解

围绕着锁周围的线程可以分为以下三类:

l  拥有锁的线程:只有一个

l  就绪队列:只有就绪队列里的线程才有机会在锁被释放时去获取锁。

l  等待队列:没有资格去获取锁。

2、Monitor.Wait(obj)方法

当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用。

Wait(obj)就是交出锁的使用权,把自己移到等待队列里,处于阻塞状态,当再次获得锁时(得先收到脉冲信号移动到就绪队列然后其他线程释放锁)返回true并且线程继续执行,否则不返回一直阻塞。

3、Monitor.Pulse方法

通知(也就是发出脉冲信号)等待队列中的线程锁定对象的状态即将发生更改。接收到脉冲后,等待线程就被移动到就绪队列中。在锁定对象被解锁后,就绪队列中的下一个线程(不一定是接收到脉冲的线程)将获得该锁。pulse()并不会使当前线程释放锁。

4、获取锁的过程

当一个线程尝试着lock一个同步对象的时候,该线程就在就绪队列中排队。一旦没人拥有该同步对象,就绪队列中的线程就可以占有该同步对象。这也是我们平时最经常用的lock方法。

为了其他的同步目的,占有同步对象的线程也可以暂时放弃同步对象,并把自己流放到等待队列中去。这就是Monitor.Wait。由于该线程放弃了同步对象,其他在就绪队列的排队者就可以进而拥有同步对象。

比起就绪队列来说,在等待队列中排队的线程更像是二等公民:他们不能自动得到同步对象,甚至不能自动移动到就绪队列。而Monitor.Pulse的作用就是开一次门,使得一个正在等待队列中的线程移动到就绪队列;相应的Monitor.PulseAll则打开门放所有等待队列中的线程到就绪队列。

5、Monitor.Wait(obj,timeOut)

阻塞自己后把自己调到等待线程,直到再次获得锁才返回继续执行。

关于该方法的一些理解分析:

l  第二个参数 tiemout表示线程释放锁进入等待队列后到进入就绪队列之前等待的一个限定时间(单位是毫秒)。

l  如果在限定时间内再次获得锁(包括收到脉冲信号然后移到就绪队列并且其他线程释放锁)就返回true然后继续运行;

l  如果在限定时间内没有收到脉冲信号,超时后,就被移到就绪队列,直到获得锁才返回,返回false;

l  如果在限定时间内收到脉冲信号,移动到就绪队列,直到获得锁才返回,返回true;

l  该方法只会在再次获得锁时才会返回,否则一直阻塞(一开始是在等待队列,最终会被移动到就绪队列);

l  建议:pulse后直接wait,中间别放其他代码。因为Monitor.Wait(obj,timeOut) 方法返回false还是true取决于在限定时间内是否收到脉冲信号从而移到就绪队列;

关于lock、线程池和定时器的简单介绍

l  Lock是一个语法糖,效果相当于Monitor的TryEnter和Exit方法

l  Lock锁定的对象建议是类的一个static对象,详情见 http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html

l  线程池 http://www.cnblogs.com/huangxincheng/archive/2012/03/18/2405039.html

DispatcherTimer类的使用

DispatcherTimer类位于System.Windows.Threading命名空间下,类似于winform的Timer类。
{ DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += new EventHandler(timer_Tick); } void timer_Tick(object sender, EventArgs e) { tb.Text = DateTime.Now.ToLongTimeString(); } 上面的代码演示了一个简单的时钟程序,每隔一秒中更新一次时间

l

C#多线程学习之:Monitor类的更多相关文章

  1. C#使用Monitor类、Lock和Mutex类进行多线程同步

    在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁, ...

  2. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

  3. 多线程状态与优先级、线程同步与Monitor类、死锁

    一.线程状态 二.线程优先级 三.初步尝试多线程 class Program { static void Main(string[] args) { while (true) { MessagePri ...

  4. 【转】C#多线程学习

    C#多线程学习(一) 多线程的相关概念 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序 ...

  5. C# 多线程学习总结

    C# 多线程学习总结 C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. ...

  6. C#深入学习 ----多线程学习(一)第一天学习

    学习最好的方法就是总结,并写下来,能让别人看懂,自己肯定是掌握了的. 针对软件开发,一直停留在能做的层次,今天得到大牛指点,觉得有必要对这门技术深入学习. 翻阅园内各大神的文章,收益匪浅,在这里做下总 ...

  7. 多线程学习-基础(六)分析wait()-notify()-notifyAll()

    一.理解wait()-notify()-notifyAll()obj.wait()与obj.notify()必须要与synchronized(Obj)一起使用,也就是wait,notify是针对已经获 ...

  8. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  9. C#多线程学习笔记

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. java多线程学习

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...

随机推荐

  1. 如何居中div?

    如何居中div? 水平居中 1 //给div设置一个宽度,然后添加margin:0 auto属性 2 3 div{ 4 width:200px; 5 margin:0 auto; 6 } 让绝对定位的 ...

  2. 用VS2010进行CMAKE的时候“LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏”

    由于要编译LTP,LTP在MINGW下又不能编译,所以忍痛安装了VS2010+CMAKE. 由于VS在本科时候虐我千百遍,所以一直心存阴影... 转入正题,当cmake的时候, 它提示 “LINK : ...

  3. Android无线测试之—UiAutomator UiDevice API介绍七

    截图与等待空闲 一.截图和等待空闲相关知识: 1)图片缩放比例:例如图片从100像素缩小到50像素 2)图片质量:是指图片大小,质量越高图片越大,质量越低图片越小 3)File类:指的是一个文件或者一 ...

  4. 【BZOJ1266】[AHOI2006]上学路线route Floyd+最小割

    [BZOJ1266][AHOI2006]上学路线route Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林 ...

  5. android 手机设置铃声

    和应用程序相比,普通用户在初初接触智能手机时最先反而会对多媒体功能产生兴趣,尤其是铃声.壁纸设定之类个性化功能,更是让不少追求时尚的年轻人乐此不疲.对于Android手机来说,其铃声.图片的个性化空间 ...

  6. 2、Python request、BeautifulSoup(download mm_pic)

    import requests from bs4 import BeautifulSoup import os class DownLoadImg(object): def __init__(self ...

  7. 隐马尔可夫模型(hidden Markov model,HMM)

    定义: 隐马尔科夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测而产生观测随机序列的过程. 隐马尔科夫模型由初始概率分布.状态转移概率分布 ...

  8. Python基础-set集合

    1.集合的创建 s = set('fansik and fanjinbao') print(s) 打印结果(去掉了重复的字符):{'k', 'd', 'f', 'n', ' ', 'j', 'i', ...

  9. django路由系统之反向生成url

    from niubin.service import v1 from django.urls import reverse from django.shortcuts import HttpRespo ...

  10. 进程理论基础(Day32)

    背景知识 顾名思义,进程即一个软件正在进行的过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老的也是最重要的抽象概念之一.操作系统的其他 ...