C#的lock关键字

using System;
using System.Threading;

namespace Test
{

    class Program
    {
        //一、Lock定义
        //lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),
        //互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。
        //在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。
        //这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生。
        //而在.NET中最好了解一下进程、应用域和线程的概念,因为Lock是针对线程一级的,而在.NET中应用域是否会对Lock起隔离作用,
        //我的猜想是,即不在同一应用域中的线程无法通过Lock来中断;另外也最好能了解一下数据段、代码段、堆、栈等概念。
        //在C# lock关键字定义如下:
        //lock(expression) statement_block,其中expression代表你希望跟踪的对象,通常是对象引用。
        //如果你想保护一个类的实例,一般地,你可以使用this;如果你想保护一个静态变量(如互斥代码段在一个静态方法内部),
        //一般使用类名就可以了。而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。

        static void Main(string[] args)
        {
            Thread thread1 = new Thread(new ThreadStart(ThreadStart1)) { Name = "Thread1" };
            Thread thread2 = new Thread(new ThreadStart(ThreadStart2)) { Name = "Thread2" };
            Thread thread3 = new Thread(new ThreadStart(ThreadStart3)) { Name = "Thread3" };
            thread1.Start();
            thread2.Start();
            thread3.Start();

            //锁住一个字符串更为神奇,只要字符串内容相同,就能引起程序挂起。
            //原因是在.NET中,字符串会被暂时存放,如果两个变量的字符串内容相同的话,
            //.NET会把暂存的字符串对象分配给该变量。所以如果有两个地方都在使用lock(“my lock”)的话,它们实际锁住的是同一个对象。
            //lock ("字符串") 

            //lock(this) 如果this 为 public class new出来的实例是不同的,没互斥效果
            //lock(typeof (MyClass)) 锁定它,就锁定了该对象的所有实例
        }

        static readonly object _object = new object();
        static void Done(int millisecondsTimeout)
        {
            Console.WriteLine(string.Format("{0} -> {1}.Start", DateTime.Now.ToString("HH:mm:ss"), Thread.CurrentThread.Name));
            //下边代码段同一时间只能由一个线程在执行
            lock (_object)
            {
                Console.WriteLine(string.Format("{0} -> {1}进入锁定区域.", DateTime.Now.ToString("HH:mm:ss"), Thread.CurrentThread.Name));
                Thread.Sleep(millisecondsTimeout);
                Console.WriteLine(string.Format("{0} -> {1}退出锁定区域.", DateTime.Now.ToString("HH:mm:ss"), Thread.CurrentThread.Name));
            }
        }
        static void ThreadStart1()
        {
            Done(5000);
        }
        static void ThreadStart2()
        {
            Done(3000);
        }
        static void ThreadStart3()
        {
            Done(1000);
        }
    }

}
时间: 2024-10-05 09:15:33

C#的lock关键字的相关文章

转:C#中Monitor对象与Lock关键字的区别分析

Monitor对象1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object) 在指定对象上获取排他锁. Exit(Object) 释放指定对象上的排他锁. IsEnte

C#中的lock关键字

前几天与同事激烈讨论了一下,有一点收获,记录起来. 首先给出MSDN的定义: lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 先来看看执行过程,代码示例如下: 假设线程A先执行,线程B稍微慢一点.线程A执行到lock语句,判断obj是否已申请了互斥锁, 判断依据是逐个与已存在的锁进行object.ReferenceEquals比较(此处未加证实),如果不存 在,则申请一个新的互斥锁,这时线程A进入lock里面了. 这时假设

c#多线程中Lock()关键字的用法小结

本篇文章主要是对c#多线程中Lock()关键字的用法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 本文介绍C# lock关键字,C#提供了一个关键字lock,它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待. 每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生.

C# 中使用Lock关键字

 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. 而在.NET中

关于lock关键字

线程同步对象关键字lock,是以lock对应的object对象为准,即任意线程lock住lockObj对象之后,其他线程无论在其他任何代码段使用lock(lockObj)去进行线程同步时,都将被阻塞. 锁定的是lockObj对象,不是lock对应大括号包含的代码段. 由此可见这里的lockObj被当盾牌使,而大括号内的则是被保护的平民.  关于lock关键字

C#中Monitor对象与Lock关键字的区别分析

这篇文章主要介绍了C#中Monitor对象与Lock关键字的区别,需要的朋友可以参考下 Monitor对象 1.Monitor.Enter(object)方法是获取 锁,Monitor.Exit(object)方法是释放锁,这就是Monitor最常用的两个方法,当然在使用过程中为了避免获取锁之后因为异常,致锁 无法释放,所以需要在try{} catch(){}之后的finally{}结构体中释放锁(Monitor.Exit()).2.Monitor的常用属性和方法: Enter(Object)

lock关键字

[lock关键字] lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放. lock 关键字在块的开始处调用 Enter,而在块的结尾处调用 Exit. 通常,应避免锁定 public 类型 [Monitor.Enter] 使用 Enter 获取作为参数传递的对象上的 Monitor.如果其他线程已对该对象执行了 Enter,但尚未执行对应的 Exit,则当前线程将阻止,直到对方线程释放该对

lock关键字的用法

一直以来对于lock关键字的用法都存有疑惑,也从网上看到很多关于他的资料包括MSDN,无奈MSDN讲述的真是让人上火.今天决定小小研究一下 一直都知道lock是锁定某一变量从而实现对某一代码段的独占执行. 但是对于lock(this).lock(typeof(类名)).lock(字符串).lock(公有变量) lock(私有变量) 有什么不同 却很是模糊 我假定了这样一种场景:某个时刻,只允许一个客户在打电话 定义一个客户类 代码1:(lock(this)) ///定义一个Custmer类,要求

C#中的lock关键字有何作用

作为C#的程序员来说,在遇到线程同步的需求时最常用的就是lock关键字.但如何正确并有效地使用lock,却是能否高效地达到同步要求的关键.正因为如此,程序员需要完全理解lock究竟为程序做了什么. 所涉及的知识点 • lock的等效代码 • System.Threading.Monitor类型的作用和使用方法 分析问题 1.lock的等效代码 在.NET的多线程程序中,经常会遇到lock关键字来控制同步,比如下列代码: private object o = new object(); publi