2011-01-06 7 views
6

Nếu bạn xác định dịch vụ của mình trong phạm vi đơn trong cấu hình mùa xuân, điều gì sẽ xảy ra nếu nhiều người dùng cố gắng truy cập vào nó (tức là phụ thuộc được tiêm vào bộ điều khiển của bạn) cùng một lúc ? Nó có nên gây ra bất kỳ xung đột nào không? Hoặc thùng chứa IoC sẽ giữ cuộc gọi sau cho đến khi cuộc gọi đầu tiên kết thúc? Nếu vậy nó sẽ làm chậm hiệu suất trong các ứng dụng lớn, điều đó nghe có vẻ không đúng với tôi. Bất kỳ ai có thể cho tôi câu trả lời đúng không?Khi truy cập nhiều trường hợp Spring Singleton tại cùng một thời điểm

BTW, như tôi có thể nhớ, nếu nó không phải là một singleton một, IoC container sẽ hồ bơi vài trường hợp dựa trên số lượng yêu cầu. Có thể một số người xác nhận nó?

Trả lời

12

điều gì sẽ xảy ra nếu nhiều người dùng cố gắng truy cập vào nó (tức là phụ thuộc được đưa vào bộ điều khiển của bạn) cùng một lúc?

Một hạt đơn có thể được truy cập nhiều lần đồng thời. Đó là lý do tại sao nó luôn phải an toàn theo luồng

Nếu nó gây ra xung đột?

Chỉ khi bạn thất bại để làm cho nó thread-safe

Hoặc container IoC sẽ tổ chức các cuộc gọi sau đó cho đến khi một kết thúc đầu tiên?

Không, đó sẽ là khủng khiếp


BTW, như tôi có thể nhớ, nếu nó không phải là một singleton một, IoC container sẽ hồ bơi vài trường hợp dựa trên số lượng yêu cầu. Có thể một số người xác nhận nó?

Spring có phạm vi sau đây (see Bean Scopes reference):

  • singleton (chỉ một trường hợp được quản lý cho mỗi ứng dụng)
  • prototype (một trường hợp mới cho mỗi tiêm)
  • session (một ví dụ mỗi phiên HTTP, chỉ trong Spring MVC)
  • request (một ví dụ cho mỗi yêu cầu HTTP, chỉ trong Spring MVC)
  • global session (một ví dụ cho mỗi phiên HTTP toàn cầu, chỉ trong portlet dựa trên Spring MVC)

Ngoài ra:

Tính đến mùa xuân 3.0, một phạm vi chủ đề có sẵn, nhưng không được đăng ký bởi mặc định.Để biết thêm thông tin, hãy xem tài liệu cho SimpleThreadScope.

Những gì bạn mô tả là một Hồ bơi đối tượng. Trong mùa xuân sẽ được triển khai dưới dạng FactoryBean thử nghiệm kiểu Prototype. Và nội bộ nó sẽ sử dụng một thư viện như Apache Commons/Pool.

+0

Cảm ơn bạn đã trả lời. Điều gì sẽ là thực hành tốt nhất để làm cho chủ đề lớp singleton an toàn? Tôi không nghĩ rằng sử dụng khối đồng bộ hóa sẽ là một ý tưởng tốt, vì nó là quá đắt đối với hiệu suất. – Brolinuk

+0

@Brolinuk Đôi khi bạn cần khối đồng bộ, đôi khi bạn không. Đọc [Java Concurrency in Practice] (http://www.javaconcurrencyinpractice.com/) để tham khảo thêm. Về cơ bản: nếu bạn không có trạng thái có thể thay đổi, bạn thường là chủ đề an toàn. Nếu bạn làm như vậy, bạn sẽ cần một số cách để đồng bộ hóa quyền truy cập vào trạng thái có thể thay đổi. Ngoài ra còn có [câu hỏi SO có liên quan] (http://stackoverflow.com/questions/1237980/java-5-concurrency-book-recommendations) –

4

Singletons chỉ là - singletons. Một cá thể được quản lý bởi bối cảnh Spring, và tất cả các yêu cầu đi qua một cá thể đó một cách đồng thời. Đó là vào bạn để làm cho thread-an toàn.

Nếu đậu của bạn không an toàn cho sợi, hãy cân nhắc sử dụng hạt không có vỏ hạt đơn. Spring cho phép bạn sử dụng phạm vi yêu cầu, phiên và nguyên mẫu.

+1

+1 nếu tôi có điểm cho "tùy thuộc vào bạn để đảm bảo an toàn cho chủ đề" – Kurru