【问题标题】:Does RMI guarantee the order of execution?RMI 是否保证执行顺序?
【发布时间】:2014-07-22 20:51:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: java rmi rpc


    【解决方案1】:

    由于 RMI 是同步的,操作将按照它们被调用的顺序执行。

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

    【讨论】:

    • 谢谢!你有可靠的消息来源吗?
    • @mghareeb - 拥有 50k+ 代表的人可能是一个可靠的来源。另外,这在逻辑上遵循同步的定义。
    • @StephenC 问题是我目前正在争论这个问题。我想要一个能够准确解释 RMI 提供什么以及不提供什么的来源。例如,如果在第一次推送之前连接丢失,但在第二次推送时继续,orderPreserved 仍然是真的吗?同步一词是否必然暗示了这一点?谢谢!
    • @mghareeb - 是的,是的。您可以按照我们的首要原则来工作。
    【解决方案2】:

    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 调用是在不同的线程上进行的,则不能保证它们会被远程对象按顺序处理。但这与这次的情况不同。

    【讨论】:

    • +1 但是如果调用是在不同的线程上进行的,那么确实没有顺序可以保证。
    【解决方案3】:

    RMI 是否保证执行顺序?

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

    【讨论】:

      猜你喜欢
      • 2013-07-06
      • 2016-04-29
      • 1970-01-01
      • 2021-03-07
      • 2018-01-07
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多