2012-06-12 25 views
5

Tôi có đúng cách duy nhất để ngăn phương thức thực thi hai lần cùng một lúc không bằng cách sử dụng câu lệnh lock?ngăn phương thức thực thi từ các luồng khác nhau cùng một lúc

private object lockMethod = new object(); 

public void Method() { 
    lock (lockMethod) { 
     // work 
    } 
} 

public void FromThread1() { 
    Method(); 
} 

public void FromThread2() { 
    Method(); 
} 

Tất nhiên tôi cũng có thể sử dụng MethodImpl(MethodImplOptions.Synchronized) những gì sẽ gần như giống nhau.

Có các kỹ thuật khác không?

+7

Tôi hơi lo lắng rằng bạn đang cố gắng khóa _method_ thay vì khóa _data_ - bạn đang cố giải quyết vấn đề gì? – sarnold

+0

Vì bạn không hiển thị bất kỳ phương thức 'tĩnh' nào, bạn có thực sự cố ngăn chặn thực hiện một phương thức hai lần cho cùng một cá thể cùng một lúc không? Hoặc bất kỳ hai phương pháp cho một trường hợp duy nhất cùng một lúc? – HABO

+0

phương pháp quá nhỏ đến mức trong tình huống của tôi khóa phương thức = khóa dữ liệu – javapowered

Trả lời

9

Tôi có chính xác rằng phương pháp duy nhất để ngăn phương thức thực hiện hai lần cùng một lúc là sử dụng lệnh khóa không?

Không, nhưng đây là cách "chuẩn" và có lẽ là tốt nhất. Điều đó đang được nói, thông thường bạn sẽ sử dụng khóa để đồng bộ hóa quyền truy cập vào dữ liệu cụ thể, không phải cho toàn bộ phương thức. Khóa toàn bộ một phương pháp có khả năng sẽ chặn nhiều hơn mức cần thiết.

Đối với các phương pháp khác, không gian tên System.Threading chứa nhiều loại khác được sử dụng để đồng bộ hóa các hình thức khác nhau, trong đó có ReaderWriterLockSlim, Semaphore, Mutex, các Monitor class (đó là những gì lock sử dụng trong nội bộ), vv Tất cả cung cấp nhiều cách khác nhau để đồng bộ hóa dữ liệu , mặc dù mỗi được hướng cho một kịch bản khác nhau. Trong trường hợp này, lock là phương pháp thích hợp để sử dụng.

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