确保静态字符串令牌的线程安全性和内存可见性

时间:2018-08-08 08:03:41

标签: c# multithreading locking

现在这是一个尚未探索的话题。实际上,我已经通过了数十条SO链接来解释锁定,互锁,内存屏障,围栏等。我的基本知识很清楚,但是我仍然不确定我的用例实现是否正确。这么想征求意见。

这是先驱- 1.需要在同时运行的所有线程之间共享应用程序范围的单个令牌。该应用程序是基于ASP.Net的,因此将为客户端请求启动新线程。

  1. 该令牌在服务第一次运行时生成(随后刷新)。因此,要运行的第一个线程将生成令牌。完成此操作后,其他线程将等待并在令牌生成完成后继续。

  2. 令牌每隔'X'分钟就会过期,并且第一个检测令牌到期的线程将启动刷新令牌的过程。再次有其他线程在等待。

下面是我的代码示例-

namespace abcd.def
{
    public static class SessionUtils
    {
        private static ReaderWriterLockSlim padLock;
        private static string authorizationToken;  //Does this need to be volatile ??
        private static int INTERVAL_IN_MINUTES = 60;

        static SessionUtils() {
            padLock = new ReaderWriterLockSlim();
        }

        /// <summary>
        /// 
        /// </summary>
        private static void GenerateSessionToken()
        {            
            try
            {
                padLock.EnterWriteLock();
                //some logic to generate the token bla bla
                authorizationToken = "blabla";

            } finally
            {
                padLock.ExitWriteLock();
            }
        }

        //each service thread calls this method to get the token
        public static string GetAuthorizationToken()
        {
            try
            {
                padLock.EnterReadLock();
                return authorizationToken;
            } finally
            {
                padLock.ExitReadLock();
            }
        }
    }

    //scheduler is started when the service starts
    public class RenewSessionJobScheduler
    {
        private static readonly IScheduler Scheduler;

        static RenewSessionJobScheduler()
        {
            Lock = new object();
            Scheduler = StdSchedulerFactory.GetDefaultScheduler();
        }

        public static void Start()
        {
            lock (Lock)
            {
                if (Scheduler.IsStarted)
                {
                    return;
                }

                if(INTERVAL_IN_MINUTES <= 0)
                {                    
                    return;
                }                

                Scheduler.Start();

                IJobDetail job = JobBuilder.Create<RenewSession>().Build();

                ITrigger trigger = TriggerBuilder.Create()
                    .WithDailyTimeIntervalSchedule
                      (s =>
                          s.WithIntervalInMinutes(INTERVAL_IN_MINUTES)
                      )
                    .Build();

                Scheduler.ScheduleJob(job, trigger);
            }
        }
    }

    class RenewSession : IJob, IDisposable
    {
        public RenewSession()
        {

        }

        public Task Execute(IJobExecutionContext context)
        {
            SessionUtils.GenerateSessionToken();
        }

        public void Dispose()
        {
            //nothing here
        }
    }
}

感谢您对代码可能存在的性能瓶颈或有效问题的意见

0 个答案:

没有答案