2009-12-09 24 views
16

thể trùng lặp:
Difference between lock(locker) and lock(variable_which_I_am_using)Tại sao ổ khóa được thực hiện trên các đối tượng riêng biệt?

Trong tất cả các mã ví dụ "thread-safe" tôi đã nhìn thấy, họ khóa trên một đối tượng giả riêng biệt. Tại sao ổ khóa không thể được thực hiện trực tiếp trên dữ liệu được đề cập?

+0

câu hỏi hay, đây cũng là suy nghĩ đầu tiên của tôi. – Russell

+1

Vì lợi ích của việc giúp mọi người tìm thấy câu trả lời tốt nhất mà họ đang tìm kiếm câu hỏi này nên không được đóng lại. @Bill, cái gọi là câu hỏi trùng lặp chính xác là lúng túng có tiêu đề và được diễn đạt và không nêu rõ câu hỏi cơ bản không giống như câu hỏi này. Tôi tin rằng câu hỏi này có nhiều khả năng thu hút sự chú ý hơn trong tìm kiếm. Threfore Tôi đã bỏ phiếu để mở lại. – Ash

Trả lời

18

Khóa trên một đối tượng giả private riêng biệt cho bạn đảm bảo rằng không có ai khác đang khóa trong đối tượng đó.

Nếu bạn khóa dữ liệu và cùng một phần dữ liệu hiển thị với bên ngoài, bạn sẽ mất bảo đảm đó. Ví dụ:

public class MyObject 
{ 
    public void SharedMethod() 
    { 
     lock (this) 
     { 
      // Do stuff 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyObject o = new MyObject(); 

     lock (o) 
     { 
      new Thread(() => 
      { 
       // Gets blocked 2s because of external lock 
       o.SharedMethod(); 
      }).Start(); 

      Thread.Sleep(2000); 
     } 
    } 
} 
+0

Ví dụ điển hình về vấn đề. – RichardOD

+0

Tôi nghĩ tôi hiểu rồi. Nếu bạn có một đối tượng giả riêng biệt sau đó bằng cách khóa trên một đối tượng bạn muốn sử dụng bạn không ngăn cản nó làm bất cứ điều gì? – RCIX

+0

Ý tôi là, khi bạn cố gọi một phương thức trên đối tượng cần đồng hồ gì đó. – RCIX

2

Có một số điều tuyệt vời về điều này trên blog của Eric Gunnerson. Xem herehere.

8

Jeff Richter (tác giả của CLR Via C#) giải thích lý do tại sao trong bài viết này trên Safe Thread Synchronization.

Cụ thể, trong bài viết đó phần "Tại sao ý tưởng tuyệt vời không tuyệt vời" trả lời câu hỏi của bạn.

Đó thực sự là một chương trong sách CLR Via C#.

Tóm lại, có một đối tượng riêng tư là đối tượng "đồng bộ" cho phép lớp của bạn đóng gói và kiểm soát bất kỳ khóa nào mà bạn cần. Vì vậy, bất kể có bao nhiêu khách hàng sử dụng lớp của bạn, khóa được thực hiện một cách nhất quán và chính xác.

+0

+1. Tôi sẽ chỉ ra cuốn sách của anh ấy, nhưng bài viết này có hiệu quả giống nhau! – RichardOD

+0

Nếu một đối tượng cần được khóa trong các hoạt động nhất định và nếu mã bên ngoài có thể cần phải thực hiện hai hoặc nhiều thao tác mà không có khóa được giải phóng giữa chúng, đối tượng phải phơi khóa hoặc phương pháp để lấy và giải phóng nó. Phơi bày không phải chỉ đơn giản là sẽ làm cho nó không thể cho mã bên ngoài để làm đúng những gì nó cần làm. – supercat

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