Có, bạn có thể sử dụng cùng một đối tượng khóa (về mặt kỹ thuật là monitor trong ý nghĩa khoa học máy tính và được thực hiện với các cuộc gọi đến các phương thức trong System.Monitor) theo hai phương pháp khác nhau. Vì vậy, giả sử bạn có một số tài nguyên tĩnh r
và bạn muốn có hai luồng để truy cập tài nguyên đó, nhưng chỉ có một chuỗi có thể sử dụng nó tại một thời điểm (đây là mục tiêu cổ điển của khóa). Sau đó, bạn sẽ viết mã như
public class Foo
{
private static object _LOCK = new object();
public void Method1()
{
lock (_LOCK)
{
// Use resource r
}
}
public void Method2()
{
lock (_LOCK)
{
// Use resource r
}
}
}
Bạn cần phải khóa xung quanh mỗi lần sử dụng của r
trong chương trình của bạn, vì nếu không thì hai chủ đề có thể sử dụng r
cùng một lúc. Hơn nữa, bạn phải sử dụng cùng một khóa, vì nếu không lại hai luồng sẽ có thể sử dụng r
cùng một lúc. Vì vậy, nếu bạn đang sử dụng r
theo hai phương pháp khác nhau, bạn phải sử dụng cùng một khóa từ cả hai phương pháp.
CHỈNH SỬA: Khi @diev chỉ ra trong các nhận xét, nếu tài nguyên là từng trường hợp trên các đối tượng thuộc loại Foo
, chúng tôi sẽ không làm cho _LOCK
tĩnh, nhưng sẽ làm cho dữ liệu mức cá thể _LOCK
.
Nguồn
2012-02-23 00:02:37
+1 để phát hiện "đang sử dụng"! –
xấu của tôi. Tôi muốn nói khóa (lockObject) – RedFox
Bạn nên gọi một cách rõ ràng rằng đối tượng khóa là 'static', và do đó tài nguyên mà nó đang bảo vệ cũng phải là' static'; nếu r là một tài nguyên có sẵn trên cấp độ cá thể, một đối tượng khóa mức thể hiện có thể sẽ hoạt động tốt hơn. – dlev