zoukankan      html  css  js  c++  java
  • 封装一个锁处理类

    在开发中为了防止多个线程同时访问同一资源的时候 ,我们一般会进行加锁处理,但看到有些同事写的那些散落的加锁代码感觉有些不太美观,于是自己给封装下:

    无标题


    internal struct TimedLock : IDisposable
    {
            /// <summary>
            /// 默认超时秒数
            /// </summary>
            private const int timeoutSeconds = 5;
            /// <summary>
            /// 锁住对象
            /// </summary>
            private object target;
            /// <summary>
            /// 超时抛出异常
            /// </summary>
            private static bool throwTimeoutException;
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="o"></param>
            private TimedLock(object o)
            {
                target = o;
            }
            /// <summary>
            /// 锁住对象
            /// </summary>
            /// <param name="o">想要锁住的对象</param>
            /// <param name="timeout">超时设置,默认为int.MaxValue</param>
            /// <param name="throwException">超时抛出异常</param>
            /// <returns></returns>
            public static TimedLock Lock(object o, TimeSpan? timeout = nullbool throwException = false)
            {
                if (timeout == null)
                {
                    timeout = TimeSpan.FromSeconds(timeoutSeconds);
                }
                throwTimeoutException = throwException;
                return GetLock(o, timeout.Value);
            }
            /// <summary>
            /// 获取锁
            /// </summary>
            /// <param name="o">想要锁住的对象</param>
            /// <param name="timeout">超时设置</param>
            /// <returns></returns>
            private static TimedLock GetLock(object o, TimeSpan timeout)
            {
                TimedLock tl = new TimedLock(o);
                if (!Monitor.TryEnter(o, timeout) && throwTimeoutException)
                {
                       throw new TimeoutException("Timeout waiting for lock");
                }
                Console.WriteLine("Entered Thread " + Thread.CurrentThread.GetHashCode() + ":" + DateTime.Now);
                return tl;
            }
            /// <summary>
            /// 销毁,并释放锁
            /// </summary>
            public void Dispose()
            {
                if (target != nullMonitor.Exit(target);
            }
            
    }
     
    调用示例:
    class Program
        {
            private static object o = new object();
            static void Main(string[] args)
            {
                //Retry();
                var t1 = new Thread(new ThreadStart(LockedSample1));
                t1.Name = "t1";
                t1.Start();
                var t2 = new Thread(new ThreadStart(LockedSample1));
                t2.Name = "t2";
                t2.Start();

                Console.ReadKey();
            }

            static void LockedSample1()
            {
                using (TimedLock lo = TimedLock.Lock(o, TimeSpan.FromSeconds(5), true))
                {
                    LockedSample2();
                }
            }

            static void LockedSample2()
            {
                System.Threading.Thread.Sleep(10000);
            }
    }
     
     
        
  • 相关阅读:
    java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Date
    权限控制-JS判断是否有权限进行操作跳转页面需要加target
    为你的网站装个“头像”
    本地存储由来的背景
    HTML5的新的结构元素介绍
    Canvas绘图API
    HTML5文件操作API
    认识HTML5
    基于scrapy爬虫的天气数据采集(python)
    Python strip()方法
  • 原文地址:https://www.cnblogs.com/qingyunoo/p/7615291.html
Copyright © 2011-2022 走看看