設定は以下のとおりです:DI用にAutoFacを使用するAsp.NET + MVC5。スレッドセーフティでシングルトンのプロパティを更新する
私たちは、さまざまなサービスのためのアクセストークンを管理しているクラス(シングルトン)を持っています。今や、これらのトークンは満期に近づきすぎて(10分未満)、新しいトークンを要求し、それらをリフレッシュします。あなたはインターロックは、必ず1つのスレッドだけを通過し、残りは古いトークンを取得します見ることができるように
// 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;
}
:私の現在の実装では、このようになります。私が思っているのは、トークンが上書きされているときに、別のスレッドが古いトークンの代わりに読み込みを試みるときに、部分的に不正な結果が得られるような奇妙な状況に終わることができますか?この実装に問題がありますか?
ありがとうございます!
なぜあなたはロックを使用していませんか? – Servy