2008-12-01 24 views
7

Tôi có một trang ASP.NET chạy dưới IIS sử dụng một assembly chung có chứa một lớp singleton. Tôi có nên thực hiện một cơ chế khóa trên singleton để làm cho nó thread-an toàn? Hoặc, sẽ có bất kỳ kết nối nào với máy chủ web sử dụng cùng một bản sao của singleton không?Các lớp singleton có an toàn trong IIS không?

Hy vọng tôi sẽ hỏi điều này một cách mạch lạc.

Trả lời

2

Mẫu thông thường cho các tệp .NET tạo một cá thể trên mỗi miền ứng dụng. Tình huống thông thường trong asp.net là bạn có nhiều luồng chạy qua cùng miền ứng dụng. Điều này có nghĩa bạn có thể có rất nhiều chủ đề chạy mã trong singleton của bạn cùng một lúc.

Bạn phải kiểm tra singleton và xác định (theo khả năng tốt nhất của bạn koffreflectorkoff) nếu đó là chủ đề an toàn hay không. Nếu nó giữ và sửa đổi các tài nguyên được chia sẻ, hoặc nếu nó đóng gói một số loại trạng thái được lưu trữ giữa các cuộc gọi phương thức, hãy cẩn thận.

Bạn có thể muốn bọc đơn trong một singleton thứ hai sử dụng khóa trước khi ủy thác các cuộc gọi của nó đến cuộc gọi mà bạn không có quyền kiểm soát. Bằng cách đó bạn có thể kiểm soát tốt hơn khóa hơn là chặn mọi cuộc gọi đến singleton bằng một khóa duy nhất. Nó cũng sẽ cung cấp cho bạn lợi ích của việc tập trung vị trí của mã luồng ...

2

Nếu đó là một singleton tĩnh ... không, nó không phải là chủ đề an toàn. Nó được chia sẻ trên tất cả tất cả các chủ đề đang nhấn vào phiên bản ứng dụng đó (vì vậy nhiều yêu cầu sẽ chia sẻ nó).

Tuy nhiên, những gì bạn đang sử dụng vì có thể không cần sự an toàn của luồng.

0

Trong .NET, bạn có thể triển khai Thread-safe Singleton mà không cần sử dụng khóa.

+0

-1. Các phương pháp sẽ cần phải có khóa nếu có yêu cầu. Liên kết này không đi sâu vào các chi tiết đó (chỉ về cách tạo ra lớp đơn bản thân, không phải là chức năng của nó). –

+0

+1. Nhận xét này không xứng đáng với -1. Thật vậy, các phương pháp có thể cần khóa, nhưng điều này là riêng biệt với việc thực hiện các mẫu đơn chính nó IMO. – Ben

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