2012-02-19 3 views
1

.net C# 응용 프로그램의 스레드 안전성과 동시성에 대한 이해를 돕기 위해 질문이 있습니다.캐시와 상호 작용할 때 스레드 안전성이 향상되었습니다.

예를 들어 asp.net 캐시에서 읽고 씁니다.

캐시와 상호 작용하는 대규모 .net 응용 프로그램을 개발 중입니다.

저는 동시성, 낙관적 및 비관적의 여러 수준을 알고 있습니다. 그러나 나는이 스레드 안전의 차이점을 약간 혼란스러워합니다.

캐시와 상호 작용할 때 잠금을 사용하여 읽기 및 쓰기로 캐시가 여러 스레드에서 조작되지 않도록해야합니까? 그래서 자물쇠를 사용해야합니까? 그리고 이것이 동시성에 어떻게 부합합니까?

+0

많은 질문을 한 번에 듣고 있습니다 – usr

+3

"내가 잠금 장치를 사용해야합니까?"라고하는 질문이 1 개 있습니다 나머지는 소개입니다 –

답변

4

낙관적 및 비관적 동시성은 여러 사용자가 업데이트를 처리하고 사용자가 다른 사용자가 변경 한 내용을 덮어 쓰지 못하게하는 개념입니다. 스레드 안전보다 다른 수준에서 사용됩니다. 스레드 안전을위한 잠금은 비관적 동시성과 가장 유사합니다.

ASP.NET 캐시 개체 자체는 스레드로부터 안전합니다. 컬렉션 자체가 손상되지 않고 여러 스레드에서 액세스 할 수 있습니다. 그러나 캐시에 넣은 오브젝트에 대한 스레드 안전성을 보장해야합니다.

가장 쉬운 방법은 캐시에 넣을 모든 개체를 불변으로 만드는 것입니다 (예 : .NET의 string 클래스). 일단 생성 된 객체는 결코 업데이트되지 않고 오직 읽기만 가능합니다. 읽기 전용 작업은 항상 스레드로부터 안전합니다. 데이터를 업데이트해야하는 경우 기존 객체를 기반으로 새 객체를 만들고 캐시의 객체를 바꿉니다. 그렇게하면 캐쉬 객체에 의존 할 수 있으므로 스레드 안전을 직접 처리 할 필요가 없습니다.

캐시의 개체를 업데이트해야하는 경우 해당 개체의 모든 업데이트 작업이 스레드로부터 안전한지 확인해야합니다.

+1

@ 2000 스레드가 캐시에서 읽기를 원한다면 하나는 읽기 시작했습니다. 다른 1999 년은 기다리고 있을까요? –

0

본질적으로 낙관적 잠금 체계는 정상적인 작동에서 동일한 데이터에 대한 쓰기가 동시에 발생하지 않는다는 아이디어를 기반으로합니다. 그래서 그들은 어떤 종류의 버전 관리 메신저를 가지고 있으므로 잠재적 인 충돌이 감지 될 수 있으며 오류를 던집니다. 일반적으로 "다른 사람이이 데이터를 변경했습니다. 다시 시도하십시오."라는 크루 드 앱에서 현재 데이터를 반환하여이를 수행 할 수 있습니다.

비관적 잠금 체계는 정상 작동시 대량의 쓰기가 동시에 수행되므로 잠금이 수행되고 현재 쓰기가 완료 될 때까지 동시 업데이트가 수행되지 않는다고 가정합니다. CRUD 응용 프로그램에서 "Fred 사용자는 잠긴 고객 빌이 있습니다. 나중에 다시 시도하십시오.

구현하기 위해 선택한 잠금 메커니즘은 여전히 ​​스레드 안전해야하며, 동시 쓰기가 발생하거나

관련 문제