2011-02-24 30 views
6

Một vài lần tôi đã đi qua mã này, nơi một biến địa phương trong một lớp (nó không phải là một biến tĩnh) đã được sử dụng trong một khóa.Điểm của việc sử dụng biến cục bộ không tĩnh trong khóa là gì?

public class SomeClass 
{ 
    private object obj = new object(); 
    .... 
    .... 
    lock(obj) 
    { 

    } 
} 

Có điểm khóa nào cho rằng biến thể hiện của nó không?

+2

Có, nếu bạn cần đồng bộ hóa đối tượng trong trường hợp cụ thể – Stecya

+2

Đó không phải là biến * cục bộ * (cục bộ thành một phương thức), nhưng * trường * hoặc * biến mẫu *. – Justin

+1

Bạn có thể giải thích tại sao bạn nghĩ rằng điều này có thể là một vấn đề? –

Trả lời

14

Có bất kỳ điểm nào được khóa cho rằng một biến mẫu không?

Nhiều chủ đề có thể hoạt động trên cùng một phiên bản và khóa là cần thiết cho an toàn chỉ. Hãy suy nghĩ, ví dụ, của một hàng đợi được chia sẻ.

+0

Vì vậy, nếu một hàng đợi được chia sẻ, nó sẽ không được tốt hơn để làm cho nó tĩnh? Tôi chỉ gặp khó khăn trong việc hình dung trường hợp sử dụng này trong tâm trí của tôi. Với tôi vì bất kỳ biến thể hiện nào là cục bộ cho cá thể lớp đó, nhiều luồng khởi tạo lớp này sẽ có bản sao khác của nó. Tôi đang thiếu gì? – imak

+0

@imak: Hãy suy nghĩ về hàng đợi công việc ('lớp TaskQueue'). Bây giờ hãy nghĩ đến một cá thể duy nhất của 'TaskQueue' này. Bây giờ nghĩ về nó được chia sẻ giữa nhiều chủ đề (có thể nhiều nhà sản xuất và nhiều người tiêu dùng). Chỉ có một thể hiện của hàng đợi và tất cả các biến mẫu được chia sẻ giữa các luồng khác nhau. Một biến thể hiện cho khóa là cần thiết để làm cho trường hợp này "thread-safe". – jason

+2

@imak: Để mở rộng ví dụ của Jason: giả sử bạn có hai hàng đợi. Q1 được sử dụng trên các chủ đề Alpha và Bravo. Q2 được sử dụng trên các chủ đề Charlie và Delta. Tại sao luồng Alpha truy cập Q1 ngăn cản Charlie và Delta cả truy cập Q2 cùng một lúc? Điều đó sẽ ngăn Bravo (và Charlie và Delta) truy cập vào Q1, nhưng không có lý do gì khiến Charlie và Delta phải bị cấm truy cập vào Q2 trong thời gian đó. –

5

Khóa tĩnh sẽ hữu ích để kiểm soát quyền truy cập vào biến tĩnh. Một khóa thể hiện sẽ hữu ích cho việc kiểm soát truy cập vào một biến cá thể.

Không có điểm nào trong việc sử dụng đối tượng khóa cục bộ để bảo vệ biến cục bộ (trừ khi nó là biến ngoài của một hàm ẩn danh hoặc trong trình lặp), vì các chủ đề khác sẽ không có quyền truy cập vào khóa hoặc biến.

+1

Trừ khi bạn có một biến cục bộ được truy cập bằng 'Hành động' hoặc' Func' hoặc các phương thức nặc danh được định nghĩa trong cùng một phương thức. –

+0

@Jim Mischel - Cố định, cảm ơn! –

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