zoukankan      html  css  js  c++  java
  • 【C#】【Thread】SpinLock

       SpinLock结构是一个低级别的互斥同步基元,它在等待获取锁时进行旋转。 在多核计算机上,当等待时间预计较短且极少出现争用情况时,SpinLock 的性能将高于其他类型的锁。 不过,我们建议您仅在通过分析确定 System.Threading.Monitor 方法或 Interlocked 方法显著降低了程序的性能时使用 SpinLock。
          即使 SpinLock 未获取锁,它也会产生线程的时间片。 它这样做是为了避免线程优先级别反转,并使垃圾回收器能够继续执行。 在使用 SpinLock 时,请确保任何线程持有锁的时间不会超过一个非常短的时间段,并确保任何线程在持有锁时不会阻塞。
          由于 SpinLock 是一个值类型,因此,如果您希望两个副本都引用同一个锁,则必须通过引用显式传递该锁。

    public void SpinLockTest()
            {
                SpinLock sLock = new SpinLock();
                StringBuilder sb = new StringBuilder();
                Action action = () =>
                {
                    bool gotLock = false;
                    for (int i = 0; i < 100; i++)
                    {
                        gotLock = false;
                        try
                        {
                            sLock.Enter(ref gotLock);//加锁
                            sb.Append(i.ToString());
                        }
                        finally
                        {
                            //真正获取之后,才释放
                            if (gotLock) sLock.Exit();//解锁
                        }
                    }
                };
    
                //多线程调用action
                Parallel.Invoke(action, action, action);
                Console.WriteLine("输出:{0}",sb.ToString());
            }
  • 相关阅读:
    SQL 日常练习 (十八)
    SQL 日常练习 (十七)
    SQL 日常练习 (十六)
    SQL 日常练习(十五)
    SQL 日常练习 (十四)
    Join 实现 2 表数据联动
    SQL 强化练习 (十三)
    SQL 强化练习 (十二)
    SQL 强化练习 (十一)
    SAP B1:水晶报表中用Code128制作条型码的方法
  • 原文地址:https://www.cnblogs.com/mqxs/p/6237095.html
Copyright © 2011-2022 走看看