返回介绍

为多线程处理同步数据

发布于 2025-02-23 23:16:11 字数 3089 浏览 0 评论 0 收藏 0

多个线程可以调用单个对象的属性和方法时,对这些调用进行同步处理是非常重要的。 否则,一个线程可能会中断另一个线程正在执行的任务,可能使该对象处于无效状态。 其成员不受这类中断影响的类叫做线程安全类。

公共语言基础结构提供了几种策略,可用于同步对实例和静态成员的访问:

  • 同步代码区域。 你可以使用 Monitor 类或编译器支持此类,以同步块的代码只需要它,提高性能。
  • 手动同步。 可以使用 .NET Framework 类库提供的同步对象。 请参阅 同步基元概述 ,其中包括的讨论 Monitor 类。
  • 同步上下文。 你可以使用 SynchronizationAttribute 要启用简单的自动化同步 ContextBoundObject 对象。
  • 中的集合类 System.Collections.Concurrent 命名空间。 这些类提供了内置的同步添加和删除操作。 有关详细信息,请参阅 线程安全集合 。

公共语言运行时提供一个线程模型,在该模型中,类分为多种类别,这些类别可以根据要求以各种不同的方式进行同步。 下表显示了为具有给定同步类别的字段和方法提供的同步支持。

类别全局字段静态字段静态方法实例字段实例方法特定代码块
无同步NoNoNoNoNoNo
同步上下文NoNoNoNo
同步代码区域NoNo仅当标记时No仅当标记时仅当标记时
手动同步手动手动手动手动手动手动

无同步

这是对象的默认情况。 任何线程都可以随时访问任何方法或字段。 一次只能有一个线程访问这些对象。

手动同步

.NET Framework 类库提供大量用于同步线程的类。 请参阅 同步基元概述 。

同步代码区域

你可以使用 Monitor 类或编译器关键字来同步块的代码、 实例方法和静态方法。 不支持同步静态字段。

Visual Basic 和 C# 都支持使用特定语言关键字标记代码块,在 C# 中使用的是 lock 语句,在 Visual Basic 中使用的是 SyncLock 语句。 由线程执行代码时,会尝试获取锁。 如果该锁已由其他线程获取,则在锁变为可用状态之前,该线程一直处于阻止状态。 线程退出同步代码块时,锁会被释放,与线程的退出方式无关。

备注

lockSyncLock 语句实现使用 Monitor.Enter 和 Monitor.Exit ,以便其他方法 Monitor 可以与它们在同步区域内的结合使用。

还可以用 MethodImplAttributeMethodImplOptions.Synchronized 修饰方法,其效果和使用 监视器 或其中一个编译器关键字锁定整个方法主体相同。

Thread.Interrupt 可用来中断线程从如等待同步代码区域的访问的阻止操作。 Thread.Interrupt 还用于中断操作,如外的线程 Thread.Sleep 。

重要

为保护 static 方法(Visual Basic 中的 Shared 方法),请不要锁定类型,即:C# 中的 typeof(MyType) 、Visual Basic 中的 GetType(MyType) 或 C++ 中的 MyType::typeid 。 请改用私有静态对象。 同样,不要使用 C# 中的 this (Visual Basic 中的 Me )锁定实例方法。 请改用私有对象。 类或实例可由不是你自己的代码锁定,这可能会引起死锁或性能问题。

编译器支持

Visual Basic 和 C# 支持使用语言关键字 Monitor.Enter 和 Monitor.Exit 要锁定的对象。 Visual Basic 支持 SyncLock 语句;C# 支持 lock 语句。

在这两种情况下,如果代码块中引发异常,则 lockSyncLock 获取的锁将自动释放。 C# 和 Visual Basic 编译器在发出 try / finally 块时,在 try 的起始处使用 Monitor.Enter ,在 finally 块中使用 Monitor.Exit 。 如果 lockSyncLock 块内部引发了异常,则会运行 finally 处理程序,从而允许执行任何清除工作。

同步上下文

可以使用任何 ContextBoundObject 上的 SynchronizationAttribute 来同步所有实例方法和字段。 同一上下文域中的所有对象都共享同一个锁。 允许多个线程访问方法和字段,但在任一时刻只允许一个线程访问。

另请参阅

SynchronizationAttribute
线程与线程处理
同步基元概述
SyncLock 语句
lock 语句

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文