2010-05-11 21 views
7

Có thể tạo một lớp Singleton phổ quát, ở bất kỳ thời điểm nào, chỉ có một cá thể được chia sẻ trên nhiều quy trình Java?Làm thế nào để tạo một lớp Singleton chéo trong Java

+2

Một lần cho mỗi đăng nhập vũ trụ/máy chủ/người dùng? –

+0

Hoặc đa vũ trụ? Tuy nhiên, đây là những lỗ trắng khó nắm bắt những trường hợp mới khi bạn ít mong đợi nó nhất. – mdma

+1

Đây không phải là bản sao của câu hỏi được chỉ định. Câu hỏi khác đề cập đến một ứng dụng nói chung. Câu hỏi này đặc biệt về mẫu Singleton qua các ranh giới quy trình. – howettl

Trả lời

6

Nhiều quy trình Java không chia sẻ cùng một máy ảo.

Vì vậy, bạn sẽ kết thúc với một cá thể JVM lưu trữ singleton, sau đó một cá thể JVM cho mỗi quá trình truy cập vào singleton bằng cách sử dụng Gọi phương thức từ xa như @Little Bobby Tables đề xuất.

Dù sao xem xét When is a Singleton not a Singleton:

Nhiều Singletons trong hai hoặc nhiều máy ảo

Khi bản sao của lớp chạy Singleton trong nhiều máy ảo, một thể hiện được tạo ra cho mỗi máy. Rằng mỗi máy ảo có thể giữ Singleton riêng của nó có vẻ hiển nhiên nhưng trong các hệ thống phân tán như các hệ thống sử dụng EJB, Jini và RMI, nó không đơn giản như vậy. Vì các lớp trung gian có thể ẩn các công nghệ phân tán, để cho biết một đối tượng thực sự được khởi tạo ở đâu có thể khó khăn.

Ví dụ: chỉ vùng chứa EJB quyết định cách thức và thời điểm tạo đối tượng EJB hoặc để tái chế các đối tượng hiện có. EJB có thể tồn tại trong một máy ảo khác với mã gọi nó. Hơn nữa, một EJB đơn có thể được khởi tạo đồng thời trong một số máy ảo. Đối với một bean phiên không trạng thái, nhiều cuộc gọi đến những gì xuất hiện, với mã của bạn, là một thể hiện thực sự có thể là các cuộc gọi đến các cá thể khác nhau trên các máy ảo khác nhau. Ngay cả một thực thể EJB có thể được lưu thông qua một cơ chế bền vững giữa các cuộc gọi, do đó bạn không có ý tưởng gì thể hiện câu trả lời của bạn gọi phương thức. (Khóa chính là một phần của thông số bean thực thể là cần thiết chính xác vì danh tính tham chiếu không được sử dụng trong việc xác định bean.)

Khả năng lây lan danh tính EJB của một cá thể EJB duy nhất trên nhiều máy ảo nhầm lẫn nếu bạn cố gắng viết một Singleton trong bối cảnh của một EJB. Các trường thể hiện của Singleton sẽ không độc đáo trên toàn cầu. Bởi vì một số máy ảo có liên quan đến những gì dường như là cùng một đối tượng, một số đối tượng Singleton có thể được đưa vào sự tồn tại.

Các hệ thống dựa trên các công nghệ được phân phối như EJB, RMI và Jini nên tránh các Singletons giữ trạng thái. Các đơn không nắm giữ trạng thái mà chỉ kiểm soát quyền truy cập vào các tài nguyên cũng không thích hợp với các EJB, vì quản lý tài nguyên là vai trò của thùng chứa EJB. Tuy nhiên, trong các hệ thống phân tán khác, đối tượng Singleton kiểm soát tài nguyên có thể được sử dụng trên sự hiểu biết rằng chúng không phải là duy nhất trong hệ thống phân tán, chỉ trong VM cụ thể.

3

Có, nhưng không phải không có cơ sở bên ngoài. Cách đơn giản nhất là sử dụng RMI. Các tùy chọn khác bao gồm CORBA hoặc Dịch vụ Web - Chỉ cần google nó lên.

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