> 백엔드 개발 > C++ > Multithreaded C#에`lek (this)`를 사용하는 이유는 무엇입니까?

Multithreaded C#에`lek (this)`를 사용하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-31 06:11:09
원래의
365명이 탐색했습니다.

Why is using `lock(this)` in multithreaded C# discouraged?

가 멀티 스레드 c#에서 문제가되는지 Microsoft의 문서는 해당 객체가 공개적으로 액세스 할 수있는 경우 객체 액세스를 보호하기 위해 를 사용하는 것을 권장합니다. 이 권고의 배후에 대한 이유를 탐색합시다. lock(this) :

를 사용하는 주요 위험 lock(this)

통제되지 않은 잠금 : 공개적으로 액세스 가능한 객체는 lock(this) 코드가 에서 잠금을 얻을 수 있습니다. 이것은 예측할 수없는 동기화 문제의 문을 열어서 멀티 스레드 코드를 올바르게 설계하고 디버깅하기가 매우 어렵게 만듭니다.

  1. 캡슐화 위반 :

    개인 필드 및 전용 잠금 객체 사용이 일반적으로 선호됩니다. 이 접근법은 액세스 제어를 강화하고 잠금 메커니즘을 내부를 유지하여 캡슐화를 유지합니다. 잠금 구현을 노출 시켜이 중요한 설계 원칙을 손상시킵니다. 의 행동에 대한 오해 : 일반적인 오해는 는 어떻게 든 물체를 읽기 전용한다는 것입니다. 이것은 잘못되었습니다. 객체는 잠금 this 키 로만 작동합니다. 다른 스레드가 잠금을 보유하면 후속 시도가 차단되지만 객체 자체는 수정 가능합니다.

  2. 불변의 유형을 잠그기 :
  3. 현악기와 같은 불변의 유형을 잠그지 마십시오. 이들은 종종 응용 프로그램에서 공유되며 교착 상태 나 예상치 못한 행동으로 이어집니다. 대신 잠금을 위해 개인적이고 변한 객체 (전용 인스턴스와 같은)를 사용하십시오.

    예시 예 : 이 c# 코드를 고려하십시오 : lock(this) 이 예제는 문제를 강조합니다.

    는 의 잠금 장치를 보유하고 있지만, 다른 스레드는 여전히
  4. 를 동시에 수정할 수 있으며,
  5. 는 본질적으로 수정을 방해하지 않는다는 것을 보여줍니다. 이러한 보장 된 보호 부족은 경고의 핵심 이유입니다.

위 내용은 Multithreaded C#에`lek (this)`를 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿