RMI是否保证执行顺序?

时间:2014-06-02 16:54:12

标签: java rmi rpc

例如,当一个客户端执行如下操作时:

serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();
boolean orderPreserved = Z.equals(X);

假设只有一个客户端且serverQueue是普通队列,是否保证orderPreserved始终为真?

3 个答案:

答案 0 :(得分:4)

由于RMI是同步的,因此操作将以它们被调用的相同顺序执行。

换句话说,如果操作在本地执行时给出orderPreserved = true,它们将通过RMI给出相同的结果。

答案 1 :(得分:3)

  

RMI是否保证执行顺序?

从某种意义上说,你的意思是肯定的。

如果线程T按照给定的顺序对远程对象R进行或尝试进行2次RMI调用,则可以保证R将以相同的顺序依次获取这些调用。

serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();

Java方法调用的语义意味着本地(代理)方法调用以源代码顺序发生。这意味着本地第二个push在第一个push返回之前不会开始。

现在RMI的同步特性意味着本地代理push调用在远程对象的响应返回之前不会返回。代理上的调用等待来自远程方法调用的响应;即正常的返回响应(在这种情况下没有任何值)或异常响应。

因此,如果将所有内容放在一起,就可以证明对应于代理push的远程对象上的2 serverQueue次调用必须与本地调用的顺序相同,并且它们是不能重叠。

所有你需要建立的是Java不会重新排序线程中的顺序事件,并且RMI是同步的事实。其余部分遵循简单的逻辑,无需考虑/诉诸RMI实现的细节。


现在显然,如果两个push调用是在不同的线程上进行的,则无法保证它们将由远程对象按顺序处理。但这与此不同。

答案 2 :(得分:2)

  

RMI是否保证执行顺序?

RMI不必保证。 Java保证它。在第一个方法调用返回之前,您无法访问第二个方法调用。 RMI方法语义与本地方法语义相同,但参数传递模式除外。