thể trùng lặp:
Re-entrant locks in C#Recursive/khóa lồng nhau trong C# với tuyên bố khóa
Tôi đã nhìn ở đây trên StackOverflow và trên MSDN, và không thể tin rằng tôi couldn 't tìm thấy câu hỏi này kéo dài ra khỏi đó trên internets.
Giả sử tôi có một lớp học với một thành viên riêng tư mà tôi muốn truy cập trong một số phương pháp công khai. Các phương thức công khai này sẽ được gọi bởi các luồng khác nhau, do đó cần phải đồng bộ hóa.
public class MyClass
{
private Object SomeSharedData = new Object();
public void MethodA()
{
lock(SomeSharedData) {
// do something
MethodB();
}
}
public void MethodB()
{
lock(SomeSharedData) {
// do something
}
}
}
Lưu ý rằng MethodA và MethodB có thể được gọi bởi người dùng của lớp này, nhưng MethodA cũng gọi MethodB, dẫn đến tình trạng khóa lồng nhau.
Điều này có được đảm bảo an toàn không? Nói cách khác, không. NET xử lý này bằng cách tham chiếu đếm khóa, để khi tôi bật ra khỏi các phương pháp này, khóa bị giảm đi? Hoặc là. NET thực hiện một số phép thuật đằng sau hậu trường, theo đó nó chỉ đơn giản là bỏ qua tất cả các khóa tiếp theo trên đối tượng có nguồn gốc từ cùng một chủ đề?
FYI khóa chỉ là cú pháp đường trên Monitor.Enter Monitor.Exit –
@Sergey cảm ơn, tôi nghĩ rằng tôi thực sự đọc một lần trong cuốn sách C# của tôi nhưng không thể tìm thấy nó. – Dave
@ M4N ack, tôi không kiểm tra "người tham gia lại" :) – Dave