2012-02-22 27 views
16

Tôi có thể sử dụng cùng một đối tượng khóa ở hai phương pháp, được truy cập bởi hai luồng khác nhau không? Mục tiêu là làm cho chuỗi nhiệm vụ 1 và task2 an toàn.sử dụng cùng một đối tượng khóa ở hai khối mã khác nhau?

object lockObject = new object(); 

// Thread 1 
void Method1() 
{ 
    lock(lockObject) 
    { 
     // task1 
    } 
} 

// Thread 2 
void Method2() 
{ 
    lock(lockObject) 
    { 
     // task2 
    } 
} 

Trả lời

19

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.

+0

+1 để phát hiện "đang sử dụng"! –

+0

xấu của tôi. Tôi muốn nói khóa (lockObject) – RedFox

+1

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

5

Nếu bạn muốn ngăn chặn chủ đề khác nhau từ thực task1 và task2 cùng một lúc, sau đó bạn phải sử dụng đối tượng khóa tương tự.

Nếu hai tác vụ không tranh giành cho cùng một tài nguyên, bạn có thể sử dụng các đối tượng khóa khác nhau.

4

Có.

Bạn có thể và nó hoạt động. Nếu bạn không sử dụng cùng một đối tượng, các khối có thể thực hiện cùng một lúc. Nếu bạn sử dụng cùng một đối tượng, họ không thể.

Ngoài ra, bạn có nghĩa là lock(lockObject), không phải using(lockObject).

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