Java 如何在两个JVM进程之间共享对象

Java 如何在两个JVM进程之间共享对象,java,concurrency,synchronization,Java,Concurrency,Synchronization,我正在使用给定的client.jar编写聊天室应用程序。我的主要工作是编写服务器。然后,我可以在命令窗口中运行server.jar,如果我想设置第二台服务器,我将打开另一个命令窗口并再次运行server.jar。以下是我的简短代码: public class Server { public static void main(String args[]) { /*Read the parameter,such as IP address and port from conf

我正在使用给定的client.jar编写聊天室应用程序。我的主要工作是编写服务器。然后,我可以在命令窗口中运行server.jar,如果我想设置第二台服务器,我将打开另一个命令窗口并再次运行server.jar。以下是我的简短代码:

public class Server {
    public static void main(String args[]) {
        /*Read the parameter,such as IP address and port from config file
         Each line in the file represents a server*/

        // Code: Get the parameter for setting serverSocket...

        /*Here I want to use a ServerInfo class to store 
         name of all the activated server, it has an attribute 
         'ArrayList<String> list', every time before set
         up the server, firstly add server name to the list*/

        ServerInfo.getInstance().list.add(server name);

        try {
            // set up the serversocket
            while(true) {
                // listening to the client
            }
        } catch {
            // other codes
        }
    }
}
公共类服务器{
公共静态void main(字符串参数[]){
/*从配置文件中读取参数,例如IP地址和端口
文件中的每一行表示一个服务器*/
//代码:获取用于设置serverSocket的参数。。。
/*这里我想使用一个ServerInfo类来存储
所有激活服务器的名称,它有一个属性
“ArrayList列表”,每次设置前
启动服务器,首先将服务器名称添加到列表中*/
ServerInfo.getInstance().list.add(服务器名称);
试一试{
//设置服务器套接字
while(true){
//倾听客户的意见
}
}抓住{
//其他代码
}
}
}
对于
ServerInfo
类,我使用singleton获取其实例,这样每次我都可以将服务器名称添加到相同的
ArrayList

问题来了。在我第一次运行server.jar之后,我可以成功地将一个名称添加到列表中,但是,当我再次运行server.jar来设置另一台服务器时,
getInstance()
方法不起作用,似乎创建了一个
ServerInfo
类的新实例,第二个服务器名被添加到此新实例的
Arraylist
。因此,我无法将所有名称添加到同一实例的
ArrayList


怎么处理这个问题

首先,您要运行server.jar两次。这将创建两个不同的java进程,而不是线程。在这里,由于两个进程(2个server.jar进程)之间没有进程间通信,因此无法共享对象。它们被视为单独的一个

在两个不同的服务器实例之间共享对象需要非常仔细地考虑。 例如:假设您有两台不同的服务器来处理您网站的请求,当用户登录到您的网站时,您希望在两台服务器之间共享会话对象,这样,如果一台服务器宕机,另一台服务器可以处理正在进行的请求。因此,用户不会得到任何内部服务器异常

这个场景可以通过在托管域模式下使用诸如JBoss之类的应用服务器来实现。

有关Jboss作为托管域模式的更多详细信息,请检查此项

并发、信号量、同步。。。这些是你的seachy的标签你启动了另一个JVM进程,你很惊讶列表中没有预先填充第一个JVM进程中的对象?这是对您的问题的一个公正的总结吗?“无论如何要处理这个问题?”只需按要求执行:“/*从配置文件中读取参数,例如IP地址和端口文件中的每一行表示一个服务器*/”-您可以在程序的一次调用中执行此操作。扰流板:使用循环。@MarkoTopolnik是的,你的总结完全正确,很抱歉我是java新手,不能很好地总结这个问题。答案很明显:所有线程都生活在同一个JVM进程中。你不能两次运行
server.jar
并在它们之间共享对象。
在两个不同的服务器实例之间共享对象是一项艰巨的工作。
我不会说这很难,但需要适当考虑。是的,我同意这一点。你说的两个线程生活在不同的进程中是对的。从那时起,你的回答不会帮助提问者解决问题。这显然是一个初级/中级程序员课程作业。在这里加入JBoss对于解决问题来说简直是过火了。