2009-08-10 28 views
1

我正在使用RMI来实现一些分布式算法,并且由于我们正在传输相当大的对象,所以我希望有一些关于RMI何时通过网络传输串行化对象的精确度。使用Java RMI时,是否通过网络传输序列化对象?

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

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

现在,我有两个(或更多)RMI客户端调用MyServer.foo方法。 当客户端1调用它时,它将被阻止在Thread.wait()。然后,客户端2个呼叫FOO和它被阻止,因为客户端1仍处于FOO方法,该方法是同步的。

现在,问题是:什么时候客户端通过网络传输的参数?只有一次客户端2实际上可以输入foo方法或之前,当它被阻止?

红利问题:这是(传递对象的时间)是由RMI规范强制实施的行为还是此实现特定的行为?

+0

此代码甚至没有编译。不清楚你在问什么。 – EJP 2017-07-05 03:38:08

回答

1

你的例子似乎有几个问题。

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

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

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

+0

'Thread.wait()'的确是一种方法,但它是从'Object.wait()'继承的,当然是错误的调用。 – EJP 2017-07-05 03:37:37

1

bar参数在请求调用foo方法的请求中发送,该请求是RMI协议的一部分。

相关问题