나는 예외에 대한 잠금 을 해제하는 것이 엄청나게 위험한 일이라고이 오래된 질문에 대한 답변에서 아무도 언급하지 않았습니다 . 예, C #의 잠금 문에는 "최종"의미가 있습니다. 제어가 잠금을 정상적으로 또는 비정상적으로 종료하면 잠금이 해제됩니다. 당신은 모두 좋은 일인 것처럼 이야기하고 있지만 나쁜 일입니다! 처리되지 않은 예외를 발생시키는 잠긴 영역이있는 경우해야 할 올바른 일은 잠금을 해제 하고 계속 진행하는 것이 아니라 더 많은 사용자 데이터를 파괴하기 직전에 병든 프로세스 를 종료하는 것 입니다.
이런 식으로보세요. 문에 자물쇠가 달린 화장실과 밖에서 기다리는 사람들이 있다고 가정 해 보겠습니다. 화장실에서 폭탄이 터져서 그 안에있는 사람이 죽습니다. 귀하의 질문은 "그런 상황에서 다음 사람이 화장실에 들어갈 수 있도록 자물쇠가 자동으로 해제됩니까?"입니다. 네, 그럴 것입니다. 그것은 좋은 일이 아닙니다. 폭탄이 터져서 누군가를 죽였습니다! 배관이 파괴되었을 수 있고 집은 더 이상 구조적으로 건전하지 않으며 거기에 또 다른 폭탄이있을 수 있습니다 . 해야 할 옳은 일은 가능한 한 빨리 모든 사람을 내보내고 집 전체를 철거하는 것입니다.
내 말은, 생각해보십시오. 다른 스레드에서 변경되지 않고 데이터 구조에서 읽기 위해 코드 영역을 잠그고 해당 데이터 구조에서 예외가 발생한 경우 데이터 구조가 그 때문일 가능성이 높습니다. 손상되었습니다 . 이제 사용자 데이터가 엉망입니다. 손상된 데이터 를 저장하기 때문에이 시점에서 사용자 데이터를 저장 하지 않으려 고합니다 . 프로세스를 종료하십시오.
다른 스레드가 동시에 상태를 읽지 않고 변형을 수행하기 위해 코드 영역을 잠그고 변형이 발생 하면 이전에 데이터가 손상되지 않았 으면 이제 . 잠금이 보호 해야하는 시나리오는 정확히 무엇입니까 ? 이제 해당 상태를 읽기 위해 대기중인 코드는 즉시 손상된 상태에 액세스 할 수 있으며 아마도 자체적으로 충돌 할 것입니다. 다시 말하지만 올바른 방법은 프로세스를 종료하는 것입니다.
어떻게 슬라이스하든 잠금 내부의 예외는 나쁜 소식 입니다. 질문해야 할 올바른 질문은 "예외가 발생하면 내 잠금이 정리됩니까?"가 아닙니다. 질문해야 할 올바른 질문은 "잠금 내부에 예외가 없는지 어떻게 확인합니까? 그리고 만약 있다면, 변이가 이전의 양호한 상태로 롤백되도록 프로그램을 어떻게 구성합니까?"입니다.