Monitor 类

Monitor 类

更新:2007 年 11 月

提供同步访问对象的机制。

命名空间:  System.Threading
程序集:  mscorlib(在 mscorlib.dll 中)

[ComVisibleAttribute(true)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public static class Monitor
/** @attribute ComVisibleAttribute(true) */
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true) */
public final class Monitor
public final class Monitor

说明:

应用到此类型或成员的 HostProtectionAttribute 属性 (Attribute) 具有以下 Resources 属性 (Property) 值:Synchronization | ExternalThreadingHostProtectionAttribute 不影响桌面应用程序(这些应用程序通常通过双击图标、键入命令或在浏览器中输入 URL 来启动)。有关更多信息,请参见 HostProtectionAttribute 类或 SQL Server 编程和宿主保护属性

Monitor 类通过向单个线程授予对象锁来控制对对象的访问。对象锁提供限制访问代码块(通常称为临界区)的能力。当一个线程拥有对象的锁时,其他任何线程都不能获取该锁。还可以使用 Monitor 来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码。

说明:

使用 Monitor 锁定对象(即引用类型)而不是值类型。有关详细信息,请参见 Enter 和概念主题 监视器

Monitor 具有以下功能:

  • 它根据需要与某个对象相关联。

  • 它是未绑定的,也就是说可以直接从任何上下文调用它。

  • 不能创建 Monitor 类的实例。

将为每个同步对象来维护以下信息:

  • 对当前持有锁的线程的引用。

  • 对就绪队列的引用,它包含准备获取锁的线程。

  • 对等待队列的引用,它包含正在等待锁定对象状态变化通知的线程。

下表描述了访问同步对象的线程可以采取的操作:

操作

说明

Enter, TryEnter

获取对象锁。此操作同样会标记临界区的开头。其他任何线程都不能进入临界区,除非它使用其他锁定对象执行临界区中的指令。

Wait

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

Pulse (信号), PulseAll

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

Exit

释放对象上的锁。此操作还标记受锁定对象保护的临界区的结尾。

使用 EnterExit 方法标记临界区的开头和结尾。如果临界区是一个连续指令集,则由 Enter 方法获取的锁将保证只有一个线程可以使用锁定对象执行所包含的代码。在这种情况下,建议您将这些指令放在 try 块中,并将 Exit 指令放在 finally 块中。此功能通常用于同步对类的静态或实例方法的访问。如果实例方法需要同步线程访问,则它将使用当前实例作为要锁定的对象调用 Enter 和对应的 Exit 方法。由于只能有一个线程持有当前实例上的锁,因此该方法一次只能由一个线程来执行。静态方法是使用当前实例的 Type 作为锁定对象以类似的方式来保护的。EnterExit 方法提供的功能与 C# lock 语句(在 Visual Basic 中为 SyncLock)提供的功能相同,区别在于 lockSyncLocktryfinally 块(在 Visual Basic 中为 TryFinally)来包装 Exit 方法,以确保释放监视器。

如果临界区跨越整个方法,则可以通过将 System.Runtime.CompilerServices.MethodImplAttribute 放置在方法上并在 MethodImplAttribute 的构造函数中指定 Synchronized 值来实现上述锁定功能。使用该属性后就不需要 EnterExit 语句了。请注意,该属性将使当前线程持有锁,直到方法返回;如果可以更早释放锁,则使用 Monitor 类或 C#lock 语句而不是该属性。

尽管锁定和释放给定对象的 EnterExit 语句可以跨越成员或类的边界或同时跨越两者的边界,但并不推荐这样做。

当选择要同步的对象时,应只锁定私有或内部对象。锁定外部对象可能导致死锁,这是因为不相关的代码可能会出于不同的目的而选择锁定相同的对象。

System.Object
  System.Threading.Monitor

此类型是线程安全的。

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

.NET Framework

受以下版本支持:3.5、3.0、2.0、1.1、1.0

.NET Compact Framework

受以下版本支持:3.5、2.0、1.0

XNA Framework

受以下版本支持:2.0、1.0

社区附加资源

添加
显示:
© 2016 Microsoft