【问题标题】:Using Java RMI, when exactly is the serialized object transmitted over the network? [closed]使用 Java RMI,序列化对象究竟何时通过网络传输? [关闭]
【发布时间】:2009-08-10 14:45:38
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这段代码甚至无法编译。不清楚你在问什么。

标签: java jakarta-ee rmi


【解决方案1】:

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

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

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

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

【讨论】:

  • Thread.wait() 确实是一个方法,但是它是从Object.wait() 继承而来的,调用肯定是错误的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多