代码之家  ›  专栏  ›  技术社区  ›  Julien

使用Java RMI,在网络上传输的序列化对象究竟是什么时候?

  •  1
  • Julien  · 技术社区  · 17 年前

    我正在使用RMI来实现一些分布式算法,由于我们正在传输相当大的对象,所以我想要一些关于RMI在网络上传输序列化对象的精确性。

    假设我有一个使用以下方法的远程类。

    class MyServer extends Remote {
        public synchronized void foo (Bar bar) {
            ...
            Thread.wait();
            ...
        }
    }
    

    现在,我有两个(或更多)RMI客户机调用myserver.foo方法。 什么时候? 客户1 呼叫它,它会被阻止 WAITE() . 然后, 客户2 电话 因为客户端1仍在 同步的方法。

    现在,问题是:什么时候 酒吧 的参数 客户2 通过网络传输的呼叫?只有一次 客户2 可以实际输入 方法或之前,何时阻塞?

    额外的问题:这(传输对象的时间)是由RMI规范强制执行的行为,还是这个实现是特定的?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Robin    17 年前

    您的示例似乎有几个问题。

    我假设thread.wait()实际上是这个.wait(),因为线程上没有这样的方法。并且应该在用于同步的同一对象上调用wait。

    假设这样,当客户机1调用lock.wait()时,将释放同步块上的监视器。这意味着客户端2可以访问该方法,并最终在同一等待方法处阻塞。当其他线程在同一个myserver实例上调用notify()时,wait()将释放。

    至于序列化,则是在调用此方法之前发生的。它应该发生在调用此方法的RMI代码中。

        2
  •  1
  •   nos    17 年前

    BAR参数与调用foo方法的请求在同一个请求中传输,foo方法是 RMI 协议。