2010-08-17 2 views
1

캐시와의 상호 작용을 용이하게하기 위해 CacheHelper 클래스가 있습니다. static int 필드를 사용하여 캐시 시간 제한을 지정하려고합니다. 이 필드는 초기에 const 기본값으로 설정되어 있지만 응용 프로그램이 기본 시간 초과 값을 변경하는 방법을 제공하려고합니다.고정 값 유형 멤버를 수정하기위한 잠금. 그게 필요 할까?

정적 값 유형을 수정할 때 잠글 필요가 있습니까? 세터의 자물쇠가 필요합니까? 여기서 볼 수있는 다른 문제가 있습니까? 미안하지만, 나는 여전히 멀티 스레딩에 관해서는 꽤 바보 같아.

감사합니다.

public static class CacheHelper 
{ 
    private static object _SyncRoot; 
    private static int _TimeoutInMinutes = CacheDefaults.TimeoutInMinutes; 

    public static int TimeoutInMinutes 
    { 
     get 
     { 
      return _TimeoutInMinutes; 
     } 
     set 
     { 
      lock (_SyncRoot) 
      { 
       if (_TimeoutInMinutes != value) 
       { 
        _TimeoutInMinutes = value; 
       } 
      } 
     } 
    } 

    public static void Insert(string key, Object data) 
    { 
     if (HttpContext.Current != null && data != null) 
     { 
      HttpContext.Current.Cache.Insert(key, data, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(CacheHelper.TimeoutInMinutes)); 
     } 
    } 
} 

답변

2

는 대신 휘발성 변수를 사용할 수 있습니다 ...하지만 그렇지 않으면 하나 개의 스레드에 의해 쓰여진 값이 다른 볼되지 않을 것이라고 가능하면, 뭔가이 필요합니다. 이 값에 대한 수정은 원자하지 않을 수 있습니다로 "큰"등 double 같은 유형 또는 long을 위해 당신이 정말로 , 잠금 또는 Interlocked 클래스를 사용해야

참고. 이 이전 값에 의존하지 않기 때문에

+0

휘발성과 잠금 장치를 결합해도 괜찮습니까? 시간 초과 값은 많이 읽지 만 드물게 작성됩니다 (Global.asax의 코드에 의한 응용 프로그램 시작시 이외의 경우). – mikesigs

+0

@whatispunk : 음, 아무런 해를 끼치 지는 않겠지 만 많은 도움이되지는 않습니다. 왜 둘 다 사용 하시겠습니까? 휘발성은 int 형의 경우에 충분합니다 ... –

+0

당신의 도움에 감사드립니다. 나는이 모든 것이 의미하는 바를 머리 속에 싸기 위해 노력하고 있습니다. 휘발성의 사용에 대한 다양한 의견이있는 것 같고 그 뒤에있는 대부분의 용어 (예 : 다중 CPU 및 명령 순서 등)조차도 이해할 수 없습니다. 멀티 스레딩에 대해 읽을 시간이 필요합니다. – mikesigs

0

당신은 CacheHelper의 클라이언트가

CacheHelper.TimeoutInMinutes = input.Value; 

처럼 뭔가를해야만 않는 경우 여기를 잠글 필요가 없습니다. 클라이언트가하는 경우

CacheHelper.TimeoutInMinutes += input.Value; 

같은 그런 다음 당신은 어떤 잠금

을 수행해야합니다.