2012-06-07 29 views
5

Theo đặc tả ngôn ngữ lock(obj) statement; sẽ được biên dịch như:Lợi thế của Monitor.Enter (đối tượng, ref bool) trên Monitor.Enter (đối tượng) là gì?

object lockObj = obj; // (the langspec doesn't mention this var, but it wouldn't be safe without it) 
Monitor.Enter(lockObj); 
try 
{ 
    statement; 
} 
finally 
{ 
    Monitor.Exit(lockObj); 
} 

Tuy nhiên, nó được biên dịch như:

try 
{ 
    object lockObj = obj; 
    bool lockTaken = false; 
    Monitor.Enter(lockObj, ref lockTaken); 
    statement; 
} 
finally 
{ 
    if (lockTaken) Monitor.Exit(lockObj); 
} 

Đó có vẻ là rất nhiều phức tạp hơn cần thiết. Vì vậy, câu hỏi là, lợi thế của việc thực hiện đó là gì?

Trả lời

5

Như mọi khi, Eric Lippert đã trả lời này:

Fabulous Adventures In Coding: Locks and exceptions do not mix

+0

Tôi chuẩn bị trả lời bản thân sau khi nghĩ về một câu trả lời khác không may đã bị xóa trước khi tôi có thể nhận xét về nó. Làm cho tôi suy nghĩ thêm về khi ngoại lệ có thể bị ném, các luồng bị ngắt quãng có thể ở bất cứ nơi đâu, v.v. Rõ ràng là 'Monitor.Enter' có thể trả về thành công, nhưng trước khi luồng đi vào khối' try' nó có thể bị gián đoạn. Đôi khi trang web này quá nhanh để tôn vinh tất cả những người đã giúp tìm câu trả lời. – Wormbo

2

Gần đây tôi đọc trong "CLR thông qua C#" rằng nó có thể không thực sự là một lợi thế. Lý do là khối finally luôn giải phóng tài nguyên bị khóa, ngay cả khi khối try bị thoát do lỗi không mong muốn. Điều đó có thể để tài nguyên ở trạng thái chưa được xác định và có thể truy cập được. Chương trình sẽ không bế tắc, nhưng lỗi có thể phức tạp hơn và khó tìm hơn.

Nó chắc chắn phụ thuộc vào tình hình, nhưng tôi đoán việc thực hiện hiện tại của lock có ý nghĩa nhất nếu ưu tiên của bạn là ngăn chặn deadlocks do gián đoạn bất ngờ của chủ đề tại chỗ tồi tệ nhất có thể.

Các vấn đề liên quan