这听起来可能很复杂,但我还是会问:
我正在运行使用类X的服务A。我想启动另一个服务B ,它除了新类之外还使用类A。
服务A已在运行。我对 Service B进行了热部署。
这是真正的问题- 服务B将使用X类的相同实例还是单独的实例。单例课程如何在这里帮助我?
这听起来可能很复杂,但我还是会问:
我正在运行使用类X的服务A。我想启动另一个服务B ,它除了新类之外还使用类A。
服务A已在运行。我对 Service B进行了热部署。
这是真正的问题- 服务B将使用X类的相同实例还是单独的实例。单例课程如何在这里帮助我?
每个服务都将在它自己的操作系统(OS)进程空间中运行,并且每个进程空间都有它自己的类实例。“单例”类通常使用类中的静态字段进行编码,这对于代码运行的进程空间来说是本地的,所以不,它们不会共享单例。每个人都会得到它自己的实例。
但是,您可以使用一些外部共享同步过程来做您想做的事情(例如,将单例暴露给 .Net Remoting(或 WCF)的任何 java 等价物 - 一个网络暴露端点,编码为使用一个单例,并让您的两个服务都“连接到”并使用该可远程访问的单例)
我不熟悉 Java Web 服务如何运行的细节,但如果它们都在同一个 VM 中运行,那么我认为这些类将在 VM 中的所有应用程序之间共享,因此静态字段将被共享。由于单例模式通常是通过将单个实例附加到静态成员来实现的,因此单例将被共享。
这基于:The Clean Code Talks - “Global State and Singletons”
您应该能够通过编写两个简单的 Web 服务来测试它。一个对单例做一些事情,例如设置一个标志,另一个检查它。