现在这是一个尚未探索的话题。实际上,我已经通过了数十条SO链接来解释锁定,互锁,内存屏障,围栏等。我的基本知识很清楚,但是我仍然不确定我的用例实现是否正确。这么想征求意见。
这是先驱- 1.需要在同时运行的所有线程之间共享应用程序范围的单个令牌。该应用程序是基于ASP.Net的,因此将为客户端请求启动新线程。
该令牌在服务第一次运行时生成(随后刷新)。因此,要运行的第一个线程将生成令牌。完成此操作后,其他线程将等待并在令牌生成完成后继续。
令牌每隔'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
}
}
}
感谢您对代码可能存在的性能瓶颈或有效问题的意见