은 오래된 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()
이 예외를 던지면 다른 스레드가 실행을 계속할 수 있도록 아무런 문제없이 잠금이 해제됩니다.
캐시 컬렉션은 Microsoft에서 스레드로부터 안전합니다. 외부 잠금 장치가 필요하지 않습니다. –
캐시 자체가 스레드 안전성을 보장하기 때문에 일관성이 아닌 원 자성 만 보장됩니다. 위의 예제 코드를 살펴보십시오. 만약 당신이'lock' 문을 가지고 있지 않다면, 다중 스레드는 캐시가 thread safe한지 여부와 관계없이'getValue()'를 동시에 호출 할 것입니다. –
그리고이 downvote 뒤에 이유를 궁금해, "이 대답은 유용하지 않습니다"라고. 정말? –