Tôi lưu ý rằng không ai đã đề cập trong câu trả lời của họ cho câu hỏi cũ này rằng việc giải phóng khóa khi có ngoại lệ là một điều cực kỳ nguy hiểm. Có, các câu lệnh khóa trong C # có ngữ nghĩa "cuối cùng"; khi điều khiển thoát ra khỏi khóa bình thường hoặc bất thường, khóa sẽ được giải phóng. Tất cả các bạn đang nói về điều này như thể nó là một điều tốt, nhưng nó là một điều xấu! Điều đúng đắn cần làm nếu bạn có một vùng bị khóa tạo ra một ngoại lệ không được xử lý là chấm dứt quá trình bị bệnh ngay lập tức trước khi nó phá hủy nhiều dữ liệu người dùng hơn , không giải phóng khóa và tiếp tục .
Hãy nhìn nó theo cách này: giả sử bạn có một phòng tắm với khóa cửa và một dòng người đang đợi bên ngoài. Một quả bom trong phòng tắm nổ tung, giết chết một người trong đó. Câu hỏi của bạn là "trong tình huống đó khóa sẽ tự động mở để người tiếp theo có thể vào phòng tắm?" Nó sẽ được thôi. Đó không phải là một điều tốt. Một quả bom đã nổ trong đó và giết một người! Hệ thống ống nước có thể đã bị phá hủy, ngôi nhà không còn chắc chắn về mặt cấu trúc, và có thể có một quả bom khác trong đó . Việc cần làm là đưa mọi người ra ngoài càng nhanh càng tốt và phá dỡ toàn bộ ngôi nhà.
Ý tôi là, hãy suy nghĩ kỹ: nếu bạn đã khóa một vùng mã để đọc từ cấu trúc dữ liệu mà nó không bị biến đổi trên một luồng khác và một cái gì đó trong cấu trúc dữ liệu đó đã đưa ra một ngoại lệ, thì rất tốt đó là do cấu trúc dữ liệu là tham nhũng . Dữ liệu người dùng bây giờ bị rối tung; bạn không muốn cố gắng lưu dữ liệu người dùng tại thời điểm này vì khi đó bạn đang lưu dữ liệu bị hỏng . Chỉ cần chấm dứt quá trình.
Nếu bạn đã khóa một vùng mã để thực hiện đột biến mà không có luồng khác đọc trạng thái đồng thời và đột biến ném, thì nếu dữ liệu không bị hỏng trước đây, thì chắc chắn là bây giờ . Đó chính xác là kịch bản mà khóa được cho là để bảo vệ chống lại . Bây giờ mã đang chờ đọc trạng thái đó sẽ ngay lập tức được cấp quyền truy cập vào trạng thái bị hỏng, và có thể chính nó bị sập. Một lần nữa, điều đúng đắn cần làm là chấm dứt quá trình.
Bất kể bạn cắt nó như thế nào, một ngoại lệ bên trong ổ khóa là một tin xấu . Câu hỏi phù hợp để hỏi không phải là "ổ khóa của tôi có được dọn dẹp trong trường hợp ngoại lệ không?" Câu hỏi phù hợp cần đặt ra là "làm cách nào để đảm bảo rằng không bao giờ có ngoại lệ bên trong khóa? Và nếu có, thì làm cách nào để cấu trúc chương trình của mình để các đột biến được khôi phục về trạng thái tốt trước đó?"