2012-04-22 4 views
6

asp.net의 Application 클래스에는 스레드 안전을 지원하는 Lock 메커니즘이 있습니다.응용 프로그램과 캐시 : 잠금 메커니즘

우리가 알고있는 것처럼 - Application은 전 세계적으로 액세스 할 수 있습니다.

샘플 :

Application.Lock(); 
Application["MyCode"] = 21; 
Application.UnLock(); 

확인.

하지만

는 또한 Cache 세계적으로 액세스 할 수있는 (그리고 나던/항목을 추가 잠금 메커니즘이 또한 제거하는 데 사용)

Application는 잠금 메커니즘을 가지고 있으며, Cache하지 않는합니까?

답변

6

은 오래된 ASP 기술로 남아있는 데이터 저장소입니다. 하나의 전역 잠금이 있습니다. Application.Lock()으로 전화하면 모든 스레드에서 Application 개체에 대한 모든 액세스가 차단됩니다.

반면에 ASP.NET을 사용하여 소개 된 새로운 Cache 개체는 사용자 고유의 잠금 의미를 사용할 수 있습니다. .NET의 lock 문을 사용하면 웹 응용 프로그램을 가능한 한 병렬로 유지하면서 Cache 객체에 스레드로부터 안전하게 액세스 할 수 있습니다. lock 블록을 종료 할 때 잠금 해제가 보장되므로 lock 문이 훨씬 안전합니다. 응용 프로그램 개체는이를 보장하지 않습니다. Cache는 자동 만료 메커니즘을 제공하므로 캐시에 훨씬 적합합니다. 또한 종속성 계약 및 선택적 우선 순위에 따라 키를 만료시킬 수 있습니다. 물론 Application 개체가 부족합니다.

개체보다 Application을 사용할 이유가 없습니다.

예 : 캐시에 100 개의 항목이 있고 아직 캐시에 저장하지 않으려는 항목이 캐시에 하나 있다고 가정 해 보겠습니다. 모두가 완전히 관련이없는 경우에도 차단 응용 프로그램 개체에 액세스이 시나리오에서는

if(Application["someData"] == null) 
{ 
    Application.Lock(); 
    if(Application["someData"] == null) 
    { 
     Application["someData"] = getValue(); //a very long time consuming function 
    } 
    Application.Unlock(); 
} 

: 당신이 Application를 사용하는 경우, 당신은이 작업을 수행. 그리고 getValue()에서 예외가 발생하면 잠금이 해제되지 않아 응용 프로그램이 중단됩니다. try .. finally을 감싸서 안전한지 확인해야합니다. myLockObject에 액세스해야하는 경우에만 코드 블록이 기다리고있을 것이다이 경우

if(Cache["someData"] == null) 
{ 
    lock(myLockObject) // or other shared lock for that single value 
    { 
     if(Cache["someData"] == null) 
     { 
      Cache["someData"] = getValue(); 
     } 
    } 
} 

: 한편

Cache 객체를 사용하여이 작업을 수행. Cache에 액세스하는 다른 사용자는 병렬로 잘 실행됩니다. 그리고 getValue()이 예외를 던지면 다른 스레드가 실행을 계속할 수 있도록 아무런 문제없이 잠금이 해제됩니다.

+1

캐시 컬렉션은 Microsoft에서 스레드로부터 안전합니다. 외부 잠금 장치가 필요하지 않습니다. –

+3

캐시 자체가 스레드 안전성을 보장하기 때문에 일관성이 아닌 원 자성 만 보장됩니다. 위의 예제 코드를 살펴보십시오. 만약 당신이'lock' 문을 가지고 있지 않다면, 다중 스레드는 캐시가 thread safe한지 여부와 관계없이'getValue()'를 동시에 호출 할 것입니다. –

+0

그리고이 downvote 뒤에 이유를 궁금해, "이 대답은 유용하지 않습니다"라고. 정말? –