【问题标题】:How to share the objects between two JVM processes如何在两个 JVM 进程之间共享对象
【发布时间】:2016-09-13 11:22:34
【问题描述】:

我正在使用给定的 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
        }
    }
}

对于ServerInfo类,我使用单例来获取它的实例,这样每次我都可以将服务器名添加到相同的ArrayList

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

无论如何要处理这个问题?

【问题讨论】:

  • 并发、信号量、同步...这些是您搜索的标签
  • 您启动了另一个 JVM 进程,但您对列表中没有预先填充第一个 JVM 进程中的对象感到惊讶?这是对您问题的公平总结吗?
  • “无论如何要处理这个问题?”只需按照要求执行:“/*从配置文件中读取参数,例如 IP 地址和端口 文件中的每一行代表一个服务器 */” - 您可以在一次调用该程序。剧透:使用循环。
  • @MarkoTopolnik 是的,你的总结完全正确,抱歉我是java新手,不能很好地总结问题
  • 那么答案很明显:线程都存在于 same JVM 进程中。您不能运行server.jar 两次并在它们之间共享对象。

标签: java concurrency synchronization


【解决方案1】:

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

需要非常仔细地考虑在两个不同的服务器实例之间共享对象。

例如:假设您有 2 个不同的服务器来处理您网站的请求,当用户登录到您的网站时,您希望共享 Session 对象在两台服务器之间,这样如果一台服务器出现故障,另一台服务器可以处理正在进行的请求。因此,用户不会得到任何内部服务器异常。

这个场景可以通过使用一些应用服务器来实现,比如在托管域模式下的JBoss AS。

关于 Jboss AS 托管域模式的更多详细信息,请查看这里 https://docs.jboss.org/author/display/AS7/Operating+modes

【讨论】:

  • Sharing objects between two different server instances is a tough job. 我不会说这很难,但需要适当考虑。
  • 是的,我同意这一点。
  • 你说得对,这两个线程生活在不同的进程中。从那时起,您的回答将无法帮助提问者解决他/她的问题。这显然是初学者/中级程序员的课程作业。在这里加入 JBoss 对于解决问题所需要的东西来说简直是矫枉过正。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
相关资源
最近更新 更多