【发布时间】:2013-05-24 07:17:12
【问题描述】:
在服务器端之后
Server server = new Server();
registry.rebind("Server", server);
因为我有该服务器对象的引用,如果我更改该对象的服务器中的任何字段,它会影响我在注册表上绑定的对象吗?或者它们只是同一个对象,RMI 只是获取我的对象的引用?
【问题讨论】:
在服务器端之后
Server server = new Server();
registry.rebind("Server", server);
因为我有该服务器对象的引用,如果我更改该对象的服务器中的任何字段,它会影响我在注册表上绑定的对象吗?或者它们只是同一个对象,RMI 只是获取我的对象的引用?
【问题讨论】:
从概念上讲,注册表中的对象只是真实服务器对象的委托;客户端只会看到通过远程接口公开的方法,而不是字段(或它们引用的任何内容)表示的内部状态。实际上,注册表实际上包含一个序列化的引用;当它作为 Registry 的 lookup 方法背后的机制的一部分返回给客户端时,它被转换为委托对象。你得到的对象是 never 实际的服务器对象;它始终只是一个代理。绑定只是将引用放入注册表(bind 执行“创建或错误”,rebind 执行“创建或替换”)。
换句话说,当您更改服务器对象的状态时,所有其他客户端将能够自动看到该状态更改的效果。因为 RMI 实现是多线程的,所以您的服务器对象必须使用适当的锁定来避免危险。 (什么是合适的?当然取决于申请的细节。)
【讨论】: