C# 线程同步的几种方法

锁 SpinLock 、Mutex、Monitor、lock

SpinLock
自旋锁是指当一个线程在获取锁对象的时候,如果锁已经被其它线程获取,那么这个线程将会循环等待,不断的去获取锁,直到获取到了锁。
优点:避免了线程上下文切换。性能较高。
缺点:如果长时间等待,将消耗大量的CPU资源。而且多个等待中的线程,并不是等待时间越长就先获取到锁,可能会一直等待下去。

SpinLock 结构是低级互斥同步基元,在等待获取锁时旋转。 在多核计算机上,如果应缩短等待时间且争用最少,那么 SpinLock 的性能优于其他种类的锁。 不过,建议仅在通过分析确定 System.Threading.Monitor 方法或 Interlocked 方法显著降低程序性能时,才使用 SpinLock

当锁是细粒度的并且数量巨大(例如链接的列表中每个节点一个锁)时以及锁保持时间总是非常短时,旋转可能非常有帮助.

由于 SpinLock 是值类型,因此如果希望两个副本引用的是同一个锁,必须通过引用显式传递它。

主要的方法:

         private static SpinLock spin = new SpinLock();
        public static void doWork1()
        {
            bool lockTaken = false;
            try
            {
                //申请获取锁
                spin.Enter(ref lockTaken);
                //下面为临界区
                for (int i = 0; i < 10; ++i)
                {
                    Console.WriteLine(2);
                }
            }
            finally
            {
                //工作完毕,或者发生异常时,检测一下当前线程是否占有锁,如果咱有了锁释放它
                //以避免出现死锁的情况
                if (lockTaken)
                    spin.Exit();
            }
        }
        public static void doWork2()
        {
            bool lockTaken = false;
            try
            {
                spin.Enter(ref lockTaken);
                for (int i = 0; i < 10; ++i)
                {
                    Console.WriteLine(1);
                }
            }
            finally
            {
                if (lockTaken)
                    spin.Exit();
            }

        }


         static void Main(string[] args)
        {
            Thread[] t = new Thread[2];
            t[0] = new Thread(new ThreadStart(doWork1));
            t[1] = new Thread(new ThreadStart(doWork2));
            t[0].Start();
            t[1].Start();
           // t[0].Join();
           // t[1].Join();      
            Console.ReadLine();
        }    

Mutex:
互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它,互斥锁可适用于一个共享资源每次只能被一个线程访问的情况,如果线程获取互斥体,则需要获取该互斥体的第二个线程将挂起,直到第一个线程释放该互斥体。

在 Mutex 类中,WaitOne() 方法用于等待资源被释放, ReleaseMutex() 方法用于释放资源。WaitOne() 方法在等待 ReleaseMutex() 方法执行后才会结束。。

               static Mutex mutex = new Mutex();//互斥锁 
        public static void doWork1()
        {
            try
            {
                if (mutex.WaitOne())
                {
                    for (int i = 0; i < 10; ++i)
                    {
                        Console.WriteLine(2);
                    }
                }
                //下面为临界区
               
            }
            finally
            {
                //工作完毕,或者发生异常时,检测一下当前线程是否占有锁,如果咱有了锁释放它
                //以避免出现死锁的情况
                mutex.ReleaseMut
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值