2011-07-31 32 views

Trả lời

18

Có thể có sự khác biệt lớn. Sự khác biệt lớn nhất giữa hai là ví dụ đầu tiên sử dụng một đối tượng duy nhất để khóa (do đó từ khóa static) trong khi từ khóa this trong ví dụ thứ hai ngụ ý khóa trên một cá thể. Do đó, có thể có sự khác biệt lớn so với quan điểm hiệu suất và thậm chí từ góc độ chính xác, nhưng điều đó phụ thuộc vào mã bên trong khóa. Khi bạn chỉ cần đồng bộ hóa quyền truy cập vào các trường cấp độ thể hiện, bạn không nên sử dụng từ khóa static, vì điều này sẽ đồng bộ hóa mã, thay vì dữ liệu (có thể gây ra hiệu suất không cần thiết). Tất nhiên, nếu dữ liệu chính nó là tĩnh (dữ liệu cấp lớp thay vì dữ liệu mức cá thể), bạn cần sử dụng từ khóa static. Mặt khác, khi bạn sử dụng từ khóa this để khóa, trong khi bạn đang truy cập tài nguyên chia sẻ/tĩnh, bạn sẽ (dĩ nhiên) có vấn đề chính xác, vì đồng bộ hóa trên cơ sở cá thể và nhiều phiên bản vẫn có thể truy cập dữ liệu được chia sẻ cùng một lúc.

Và có một vấn đề khác, nhưng sự khác biệt nhỏ hơn nhiều so với những khác biệt đã ghi nhận trước đó. Ví dụ đầu tiên sử dụng một đối tượng được khai báo riêng để khóa, trong khi cái kia sử dụng con trỏ this, đó là tham chiếu đến đối tượng của chính phương thức đó. Vì tài liệu tham khảo này có thể truy cập công khai với các đối tượng khác, nên chúng có thể khóa chúng trên đó, điều này có thể gây ra các bế tắc trong những trường hợp hiếm hoi.Nếu bạn là nhà phát triển ứng dụng, tôi sẽ không lo lắng nhiều về điều này (miễn là bạn không khóa những thứ như System.String hoặc System.Type), nhưng nếu bạn là nhà phát triển khung, bạn chắc chắn không nên sử dụng lock(this), vì không có cách nào để nói theo cách mà các nhà phát triển ứng dụng sẽ (ab) sử dụng mã của bạn.

8

Đó là hầu như luôn luôn thích hợp hơn để khóa trên một đối tượng chỉ đọc tin.

Sự khác biệt là this nói chung là có thể nhìn thấy mã bên ngoài, có thể mất một khóa trên nó, ví dụ: -

var obj = new YourClass(); 
lock(obj) 
{ 
    ... 
} 

... trong trường hợp bất kỳ nỗ lực bên trong của YourClass-lock (this) sẽ chặn.

1

Vì bạn không muốn khóa được truy cập từ bên ngoài đối tượng.

Nếu bạn sử dụng khóa (này), bạn có thể nhận được một bế tắc:

void blah() { 
    lock(this); 
    sleep(200); 
} 

//Some other block of code 

MyObject a; 
foreach(Mythread m in threads) 
{ 
    lock(a); 
    m.Call(a.blah); //Not the best syntax, but you get the idea. 
} 

Nếu bạn giữ khóa bên trong đối tượng nó sẽ không bế tắc.

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