1

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

假设我有一个具有以下方法的 Remote 类。

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

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

现在,问题是:Client 2调用的bar参数何时通过网络传输?只有一次客户端 2可以实际进入foo方法或之前,当它被阻塞时?

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

4

2 回答 2

1

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

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

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

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

于 2009-08-10T16:40:40.323 回答
1

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

于 2009-08-10T17:13:27.653 回答