在服务器端
Server server = new Server();
registry.rebind("Server", server);
因为我有该服务器对象的引用,如果我更改该对象的服务器中的任何字段,它是否会影响我在注册表上绑定的对象?或者它们只是同一个对象,RMI只是获得了我的对象的参考?
答案 0 :(得分:1)
从概念上讲,注册表中的对象只是真实服务器对象的委托;客户端只会看到通过远程接口公开的方法,而不是字段(或它们引用的任何内容)所代表的内部状态。实际上,注册表实际上包含一个序列化的引用;当作为Registry lookup
方法后面的机制的一部分返回给客户端时,它被转换为委托对象。你得到的对象是从不实际的服务器对象;它总是只是一个代理。绑定只是将引用放入注册表(bind
执行“创建或错误”,rebind
执行“创建或替换”。)
换句话说,当您更改服务器对象的状态时,所有其他客户端将能够自动查看该状态更改的效果。由于RMI实现是多线程的,因此您的服务器对象必须使用适当的锁定以避免危险。 (什么是合适的?当然取决于应用程序的细节。)