설정은 다음과 같습니다. DI 용 AutoFac을 사용하는 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를 통해 알 수 있듯이 하나의 스레드 만 통과하고 나머지는 이전 토큰을 가져옵니다. 내가 궁금해하는 점은 - Token이 덮어 쓰여질 때, 다른 스레드가 오래된 토큰 대신 읽기를 시도 할 때 부분적으로 망가진 결과를 얻는 이상한 상황에 처하게 될까요? 이 구현에 문제가 있습니까?
감사합니다.
왜 잠금을 사용하지 않는거야? – Servy