【发布时间】:2014-07-22 20:51:57
【问题描述】:
例如,当一个客户端执行如下操作时:
serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();
boolean orderPreserved = Z.equals(X);
假设只有一个客户端,serverQueue 是一个普通队列,是否保证orderPreserved 永远为真?
【问题讨论】:
例如,当一个客户端执行如下操作时:
serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();
boolean orderPreserved = Z.equals(X);
假设只有一个客户端,serverQueue 是一个普通队列,是否保证orderPreserved 永远为真?
【问题讨论】:
由于 RMI 是同步的,操作将按照它们被调用的顺序执行。
换句话说,如果操作在本地执行时给出 orderPreserved=true,它们将在 RMI 上给出相同的结果。
【讨论】:
orderPreserved 仍然是真的吗?同步一词是否必然暗示了这一点?谢谢!
RMI 是否保证执行顺序?
你的意思是肯定的。
如果线程 T 按给定顺序对远程对象 R 进行 2 次 RMI 调用,则保证 R 将按相同顺序依次获取这些调用。
serverQueue.push(X);
serverQueue.push(Y);
Object Z = serverQueue.front();
Java 方法调用的语义意味着本地(代理)方法调用按源代码顺序发生。这意味着在本地第二个push 不会在第一个push 返回之前启动。
现在 RMI 的同步特性意味着本地代理 push 调用在远程对象的响应返回之前不会返回。代理上的调用等待远程方法调用的响应;即正常返回响应(在这种情况下没有任何值)或异常响应。
所以如果你把这一切放在一起,你可以证明代理serverQueue对应的远程对象上的2个push调用必须与本地调用的顺序相同,并且它们不能重叠。
您只需要确定 Java 不会对线程内的顺序事件重新排序,并且 RMI 是同步的这一事实。其余的遵循简单的逻辑,无需考虑/求助于 RMI 实现的细节。
现在很明显,如果两个push 调用是在不同的线程上进行的,则不能保证它们会被远程对象按顺序处理。但这与这次的情况不同。
【讨论】:
RMI 是否保证执行顺序?
RMI 不必保证。 Java 保证它。在第一个方法调用返回之前,您无法到达第二个方法调用。 RMI 方法语义与本地方法语义相同,但参数传递方式不同。
【讨论】: