Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在哪个域中有一个Java单例实例?_Java_Singleton - Fatal编程技术网

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

在哪个域中有一个Java单例实例?,java,singleton,Java,Singleton,根据定义,可以有Java单例类的单个实例。当然,除了显然有几个,包括在不同的物理机、虚拟机、Java虚拟机上运行相同的代码 JVM有一个单实例类的保险吗 Java单例类在哪个域中是唯一的?无论应用的含义是什么,它与应用的概念有什么关系?在承载JVM的操作系统中,进程或线程的概念与此有什么关系?web服务器中的用户连接数?如果我们谈论Apache或Tomcat,它会改变吗 我设计了一个Java类,提供给其他软件开发人员,他们将通过它访问远程功能。该功能在多台远程机器上冗余实现。该类保留这些机器的

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

JVM有一个单实例类的保险吗

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


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

对于其他开发人员将如何称呼我的类,我只有一个模糊的概念。我知道这将是一个由最终用户访问的web服务器。我知道另一个软件开发人员的代码是用Java编写的(因为我替换的代码是C,并从JNI调用)。他们谈论从他们在同一台机器上制作的几个应用程序中调用我的代码,但我不知道这到底意味着什么。肯定有人在Tomcat上运行web服务器,在同一台服务器上运行多个应用程序。另一个明显倾向于ApacheWeb服务器,还有一个提到了NGINX。我对他们做的了解越少越好


我知道我的代码将在同一台机器上相对较少的JVM实例中运行(如
top
所示),我可以很高兴地使用我的singleton的这几个实例。如果web服务器的每个终端用户都有一个单身汉,这将是一个严重的问题,而一个轻微的问题是每个“应用程序”都有一个单身汉。我想在设计阶段知道,而不是在现场发现。

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

但是在web应用程序中(例如,在ApacheTomcat或类似的应用程序上),它有点不同,因为每个应用程序都有自己的类加载器,并且有另一个用于共享库的类加载器

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

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


线程通常不会影响这一点,除非您为线程编写自己的具有特定功能的类加载器。

域是app@fantaghirocco域是类加载器,而不是应用程序。现在大多数应用程序都有一个类加载器(或者至少有一个类加载器层次结构),但情况并非总是如此。