在哪个域中有Java单例的单个实例?

问题描述 投票:-2回答:1

根据定义,可以有一个Java单例类的单个实例。当然,当然有几个例外,包括在不同的物理机,虚拟机,Java虚拟机上运行的相同代码。

JVM是否具有单个singleton类的单个实例的保险吗?

Java单例类在哪个域中是唯一的?与应用程序概念有什么关系,无论其含义是什么?与托管JVM的操作系统中的进程或线程概念有什么关系? Web服务器中的用户连接?如果我们使用Apache或Tomcat,它会改变吗?


我设计了一个Java类,提供给其他软件开发人员,该类将通过它访问远程功能。该功能在多台远程计算机上冗余实现。该类保留这些机器的列表,跟踪它们的响应时间,并确保从其呼叫者接收到的请求被发送到当前响应最快的远程机器。这是单例的好用例。

我对其他开发人员将如何称呼我的班只有一个模糊的想法。我知道这将是一个Web服务器,供最终用户访问。我知道其他软件开发人员的代码是用Java编写的(因为我替换的代码是C,并且是从JNI调用的)。他们谈论从同一台计算机上制作的多个应用程序调用我的代码,但我不知道这到底意味着什么。肯定有些服务器在Tomcat上运行其Web服务器,并且同一服务器上有多个应用程序。另一个显然倾向于Apache Web Server,另一个则提到了NGINX。我对他们的工作了解得越少越好。

我知道我的代码将在同一台机器上相对较少的JVM实例中运行(如top所示,并且我对我的单例的那几个实例感到满意。如果Web服务器的每个最终用户只有1个单例,那将是一个严重的问题,而每个“应用程序”只有一个单身问题。我想在设计阶段知道,而不是在现场发现。

java singleton
1个回答
0
投票

通常,类加载器仅将每个类的单个实例加载到内存中。因此,每个Java VM中所有静态变量仅存在一次。

但是在Web应用程序中(例如在Apache Tomcat或类似的应用程序上,这有点不同,因为每个应用程序都有自己的类加载器,并且共享库还有另一个类加载器。

[当Tomcat运行两个包含相同库的应用程序时(在* .war内部),您实际上在内存中拥有同一库的两个实例,因此它们的静态变量存在两次。但是,当两个应用程序共享lib文件夹中的库时,内存中只有一个实例。

但是,通过实现自定义类加载器,您可以更改该行为,然后由您决定。

除非您编写具有线程特定功能的类加载器,否则线程通常不会对此产生影响。

© www.soinside.com 2019 - 2024. All rights reserved.