【问题标题】:RMI after bind, can i change the object that is bind?绑定后的RMI,我可以更改绑定的对象吗?
【发布时间】:2013-05-24 07:17:12
【问题描述】:

在服务器端之后

Server server = new Server();
registry.rebind("Server", server);

因为我有该服务器对象的引用,如果我更改该对象的服务器中的任何字段,它会影响我在注册表上绑定的对象吗?或者它们只是同一个对象,RMI 只是获取我的对象的引用?

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    从概念上讲,注册表中的对象只是真实服务器对象的委托;客户端只会看到通过远程接口公开的方法,而不是字段(或它们引用的任何内容)表示的内部状态。实际上,注册表实际上包含一个序列化的引用;当它作为 Registry 的 lookup 方法背后的机制的一部分返回给客户端时,它被转换为委托对象。你得到的对象是 never 实际的服务器对象;它始终只是一个代理。绑定只是将引用放入注册表(bind 执行“创建或错误”,rebind 执行“创建或替换”)。

    换句话说,当您更改服务器对象的状态时,所有其他客户端将能够自动看到该状态更改的效果。因为 RMI 实现是多线程的,所以您的服务器对象必须使用适当的锁定来避免危险。 (什么是合适的?当然取决于申请的细节。)

    【讨论】:

    • 几乎正确。 Registry 包含客户端获取的相同存根,而不是作为“Registry 查找方法背后的机制的一部分”“在返回给客户端时转换为委托对象”的中间“序列化引用”。没有这样的机器。注册表实际上只是另一个 RMI 远程对象,根本没有进出它的特殊机制。当你解决这个问题时+1。实际上它与问题完全无关:也许你应该删除它。
    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多