例如,当一个客户端执行如下操作时:
serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();
boolean orderPreserved = Z.equals(X);
假设只有一个客户端且serverQueue
是普通队列,是否保证orderPreserved
始终为真?
答案 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方法语义与本地方法语义相同,但参数传递模式除外。