使用Java RMI,何时通过网络传输序列化对象?

时间:2009-08-10 14:45:39

标签: java java-ee rmi

我正在使用RMI来实现一些分布式算法,并且由于我们传输了相当大的对象,我想要了解RMI何时通过网络传输序列化对象。

假设我有一个带有以下方法的Remote classe。

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

现在,我有两个(或更多)RMI客户端调用MyServer.foo方法。 当客户端1 调用它时,它会在 Thread.wait()中被阻止。然后,客户端2 调用 foo 并且它被阻止,因为客户端1仍然在同步的 foo 方法中。

现在,问题是:客户端2 呼叫的 bar 参数何时通过网络传输?只有客户端2 才能实际进入 foo 方法或之前,当它被阻止时?

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

2 个答案:

答案 0 :(得分:1)

您的示例似乎存在一些问题。

我假设Thread.wait()实际上是this.wait(),因为在Thread上没有这样的方法。应该在与用于执行同步的对象相同的对象上调用wait。

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

对于序列化,在调用此方法之前发生。它会发生在调用此方法的RMI代码中。

答案 1 :(得分:1)

bar参数在与调用foo方法的请求相同的请求中传输,该方法是RMI协议的一部分。