1

在服务器端之后

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

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

4

1 回答 1

0

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

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

于 2013-05-24T08:35:00.640 回答