C#线程同步——lock,Monitor,Mutex(摘录)

线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程。

多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率。

      多线程的应用程序域是相当不稳定的,因为多个线程在同一时间内都能运行共享的功能模块。为了保护应用程序的资源不被破坏,为多线程程序提供了三种加锁的机制,分别是:Monitor类、Lock关键字和Mutex类。

     1. lock

       lock实现的功能是:使后进入的线程不会中断当前的线程,而是等待当前线程结束后再继续执行。

   应用:

   private Object thisLock=new object();

   lock(thisLock){

               //锁定的代码块

    }

  注意:避免锁定 public 类型,否则实例将超出代码的控制范围。

           常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock")

           违反此准则:如果实例可以被公共访问,将出现 lock (this) 问题。

           如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。

           由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。

           最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。

           下面举例说明lock的应用:

           下面的例子中创建了5个次线程,次线程完成的任务就是:输出线程编码,延迟1秒,然后输出当时的时间

Example:

 

代码

实验结果如下:

                         图1:加lock

                                                                       

                   图2:没有lock     

从实验结果可以看出,加lock后,程序每次只能执行一个线程,只有当前线程执行完了,才会执行下一个线程 

                              未加lock,程序执行混乱,容易阻塞

2. Monitor

   lock是对Monitor的Enter和Exit的一个封装,因此Monitor类的Enter()和Exit()方法的组合使用可以用lock关键字替代

   Monitor类除了具有lock的功能外,还有以下功能:

     TryEnter()解决长期死等的问题,如果一个并发经常发生,并且持续时间很长,使用TryEnter,可以有效防止死锁或者长时间 的等待。     

    Wait()释放对象上的锁,以便允许其他线程锁定和访问该对象。在其他线程访问对象时,调用线程将等待。脉冲信号用于通知等待线程有关对象状态的更改。

      Pulse(),PulseAll()向一个或多个等待线程发送信号。该信号通知等待线程锁定对象的状态已更改,并且锁的所有者准备释放该锁。等待线程被放置在对象的就绪队列中以便它可以最后接收对象锁。一旦线程拥有了锁,它就可以检查对象的新状态以查看是否达到所需状态。

      注意:Pulse、PulseAll和Wait方法必须从同步的代码块内调用。

  3. Mutex(互斥体) 

   Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能是以牺牲更多的系统资源为代价的。     

   互斥体Mutex和事件对象EventWaitHandler属于内核对象,利用内核对象进行线程同步,线程必须要在用户模式和内核模式间切换,所以一般效率很低,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。

    互斥体Mutex类似于一个接力棒,拿到接力棒的线程才可以开始跑,当然接力棒一次只属于一个线程(Thread Affinity),如果这个线程不释放接力棒(Mutex.ReleaseMutex),那么其他所有需要接力棒运行的线程只能等着看热闹。

作者:绿茶叶 
出处:http://www.cnblogs.com/greenteaone/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载:http://www.cnblogs.com/greenteaone/archive/2010/12/29/1920847.html

时间: 2024-08-03 15:59:11

C#线程同步——lock,Monitor,Mutex(摘录)的相关文章

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)

转自 http://www.cnblogs.com/freshman0216/archive/2008/08/07/1256919.html    前两篇简单介绍了线程同步lock,Monitor,同步事件EventWaitHandler,互斥体Mutex的基本用法,在此基础上,我们对它们用法进行比较,并给出什么时候需要锁什么时候不需要的几点建议.最后,介绍几个FCL中线程安全的类,集合类的锁定方式等,做为对线程同步系列的完善和补充.       1.几种同步方法的区别       lock和M

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)

转自 http://www.cnblogs.com/freshman0216/archive/2008/07/27/1252253.html   本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开 始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释.让我们来看看这几个类的关系图:         1.lock关键字       lock是C#关键词,它将语句块

多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)

转自 http://www.cnblogs.com/freshman0216/archive/2008/07/30/1252345.html   本篇继续介绍WaitHandler类及其子类Mutex,ManualResetEvent,AutoResetEvent的用法..NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实,我们抛开.NET环境看线程同步,无非是执行两种操作:一是互斥/加锁,目的是保证临界区代码操作的"原子性":另一种是信号灯操作,目的是保证多个线程按

重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

原文:重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 线程同步 lock

Windows 8 Store Apps学习(46) 多线程之线程同步: Lock等

多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock 介绍 重新想象 Windows 8 Store Apps 之 线程同步 lock - 其实就是对 Monitor.Enter() 和 Monitor.Exit() 的一个封装 Monitor - 锁 Interlocked - 为多个线程共享的数字型变量提供原子操作 Mutex - 互斥锁,主要用于同一系统内跨进程的互斥锁 ReaderWriterLock - 读写锁 示例

C#中实现线程同步lock关键字的用法详解_C#教程

1. lock关键字保证一个代码块在执行的过程中不会受到其他线程的干扰,这是通过在该代码块的运行过程中对特定的对象加互斥锁来实现的. 2. lock关键字的参数必须是引用类型的对象.lock对基本数据类型如int,long等无效,因为它所作用的类型必须是对象.如果传入long类型数据,势必被转换为Int64结构类型,则加锁的是全新的对象引用.如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的. 3. lock(th

改善C#程序的建议6:在线程同步中使用信号量

原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待.而在引用类型上的等待机制,则分为两类:锁定和信号同步. 锁定,使用关键字lock和类型Monitor.两者没有实质区别,前者其实是后者的语法糖.这是最常用的同步技术: 本建议我们讨论

c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex

转自 http://www.cnblogs.com/xd125/archive/2007/12/12/992406.html 最近由于在准备Collection对象培训的PPT,因为涉及到SyncRoot的属性的讲解,所以对怎样在多线程应用程序中同步资源访问做了个总结:对于引用类型和非线程安全的资源的同步处理,有四种相关处理:lock关键字,监视器(Monitor), 同步事件和等待句柄, mutex类. Lock关键字    本人愚钝,在以前编程中遇到lock的问题总是使用lock(this)

C#中使用Monitor类、Lock和Mutex类来同步多线程的执行

转自 http://blog.csdn.net/tjvictor/archive/2007/01/20/1488290.aspx 在多线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库 中这是很常见的,但是在程序中由于大部分都是单线程的程序,所以没有加锁的必要,但是在多线程中,为了保持数据的同步,一定要加锁,好在 Framework中已经为我们提供了三个加锁的机制,分别是Monitor类.Lock关键字和Mutex类.         其中Lock关键词用法比较简单,Mon