我們的設置是:使用AutoFac for DI的Asp.NET + MVC5。使用線程安全更新單例的屬性
我們有一個類(這是一個單),其管理訪問令牌的各種服務。無論何時,這些令牌太接近到期(少於10分鐘),我們要求新的令牌,刷新它們。我目前的實現如下所示:
// member int used for interlocking
int m_inter = 0;
private string Token { get; set; }
private DateTimeOffset TokenExpiry { get; set; }
public SingletonClassConstructor()
{
// Make sure the Token has some value.
RefreshToken();
}
public string GetCredentials()
{
if ((TokenExpiry - DateTimeOffset.UTCNow).TotalMinutes < 10)
{
if (Interlocked.CompareExchange(ref m_inter, 1, 0) == 0)
{
RefreshToken();
m_inter = 0;
}
}
return Token;
}
private void RefreshToken()
{
// Call some stuff
Token = X.Result().Token;
TokenExpiry = X.Result().Expiry;
}
正如您所看到的,Interlocked確保只有一個線程通過,其餘的獲取舊的令牌。我想知道的是 - 我們最終會出現一種奇怪的情況:當令牌被覆蓋時,另一個線程嘗試讀取,而不是舊的令牌,得到一個部分搞砸的結果?這個實現的任何問題?
謝謝!
爲什麼你不只是使用鎖? – Servy