`

C#笔记21:多线程之线程同步中的锁定lock、Monitor(转)

 
阅读更多
C#笔记21:多线程之线程同步中的锁定lock、Monitor

1:什么是锁

2:如何选择锁定对象

3:如何锁定集合

4:Monitor



1:什么是锁

     lock 语句可以用来确保代码块完成运行,而不会被其他线程中断。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。



2:如何选择锁定对象

     提供给 lock 关键字的参数必须为基于引用类型的对象,该对象用来定义锁的范围。在上面的示例中,锁的范围限定为此函数,因为函数外不存在任何对对象 lockThis 的引用。如果确实存在此类引用,锁的范围将扩展到该对象。严格地说,提供的对象只是用来唯一地标识由多个线程共享的资源,所以它可以是任意类实例。然而,实际上,此对象通常表示需要进行线程同步的资源。例如,如果一个容器对象将被多个线程使用,则可以将该容器传递给 lock,而 lock 后面的同步代码块将访问该容器。只要其他线程在访问该容器前先锁定该容器,则对该对象的访问将是安全同步的。

复制代码
public class TestThreading
{
    private System.Object lockThis = new System.Object();

    public void Process()
    {

        lock (lockThis)
        {
            // Access thread-sensitive resources.
        }
    }

}

复制代码
     通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。锁定字符串尤其危险,因为字符串被公共语言运行时 (CLR)“暂留”。这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。因此,最好锁定不会被暂留的私有或受保护成员。某些类提供专门用于锁定的成员。例如,Array 类型提供 SyncRoot。许多集合类型也提供 SyncRoot。



3:如何锁定集合

    每个非泛型集合,都提供了一个SyncRoot的属性,如果要锁定集合,请锁定此属性。遗憾的是,我们现在已经不鼓励使用非泛型集合了,所以,泛型集合的锁定,请自己选择或创建一个锁定对象来实现。



4:Monitor

     lock代码在经编译后,会自动转换为Monitor代码,所以两者没有任何区别。唯一的区别就在于lock使用起来更加简单。

复制代码
System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
try
{
    DoSomething();
}
finally
{
    System.Threading.Monitor.Exit(obj);
}
分享到:
评论

相关推荐

    C# 多线程笔记和示例讲解

    以下是对"C#多线程笔记"中可能包含的知识点的详细解释。 1. **线程基础**: - **什么是线程**:线程是程序执行的最小单元,每个进程至少有一个线程,负责执行程序代码。 - **主线程与子线程**:主线程是程序的...

    C#多线程笔记

    通过上述知识点的介绍,我们可以看到C#中的多线程编程涉及到很多细节和技术点,理解并掌握这些内容对于编写高效、稳定的多线程应用程序至关重要。希望以上内容能够帮助大家更好地理解和应用C#中的多线程技术。

    c#多线程编程笔记

    本笔记将深入探讨C#中的多线程编程,包括其基本概念、创建线程的方式、线程同步与互斥、线程安全以及线程池的使用。 ### 1. 基本概念 - **线程**:线程是程序的执行流程,每个进程至少包含一个线程。多线程意味着...

    C#进程和线程资料集锦

    - **c#多线程编程笔记.rar**:可能是一位开发者的经验总结,包含了实践中的技巧和陷阱,对于理解和应用多线程编程非常有价值。 掌握这些知识后,无论是初学者还是中高级开发者,都能在C#环境下高效地编写多线程应用...

    C#中的lock、Monitor、Mutex学习笔记

    为了保护应用程序的资源不被破坏,为多线程程序提供了三种加锁的机制,分别是:Monitor类、Lock关键字和Mutex类。 1. lock lock实现的功能是:使后进入的线程不会中断当前的线程,而是等待当前线程结束后再继续执行...

    C#线程系列讲座笔记整理

    1. 线程同步:在多线程环境中,同步是确保数据一致性、防止数据竞争的关键。C#提供了多种同步机制,如Mutex、Semaphore、Monitor、Lock和EventWaitHandle等。 2. 死锁:当两个或更多线程相互等待对方释放资源,导致...

    线程教程 多线程教程 C# 线程.rar

    个人工作和学习中积累和总结的多线程笔记 包含异步 线程等待 线程异常 线程终止 线程安全 lock monitor mutex autoresetevent semephore readerwriterlock readerwriterlockslim

    线程笔记(多线程,异常)

    `Monitor`类提供`Enter()`和`Exit()`,相当于VB中的`SyncLock`或C#的`lock`关键字。`ReaderWriterLock`用于读写锁,`Mutex`和`AutoResetEvent`是事件同步工具,`Interlocked`类则提供了原子操作,如`i++`的线程安全...

    线程编程练习笔记

    在IT领域,线程编程是多任务处理的核心技术,特别是...通过实际编写和理解这些代码示例,你可以更好地掌握线程的使用,提升多线程编程技能,解决并发问题,提高程序性能。实践中不断学习和调试,是提升编程能力的关键。

    java .net 面试题目合集 和尚学堂面试笔记 程序员面试宝典

    5. **多线程**:线程的基本概念、同步机制(synchronized,Lock)、线程池,以及并发容器如ConcurrentHashMap。 6. **IO流**:输入输出流分类、缓冲流、对象流、字符流的使用,以及NIO(New IO)框架。 7. **反射*...

    C#蜂巢工作机制系统与源代码.zip

    C#提供了`lock`语句、`Monitor`类、`Mutex`、`Semaphore`等同步原语,以及`async/await`关键字来处理并发问题。 5. **状态管理(State Management)**:在处理任务时,保持状态的一致性至关重要。这可以通过使用...

Global site tag (gtag.js) - Google Analytics