2010-04-10 113 views
2

我有一个存储在'服务器'上的类,多个客户端可以调用此方法。这个方法返回一个类。现在,当客户端调用此类中的访问器方法时,例如设置访问器方法。我希望服务器上的对象能够在所有其他客户端上进行更新和同步。Java RMI方法同步

如何使用:

public synchronized setStatus(String s) { this.status = s; } 

的Java内实现这一目标。

由于

+0

“此方法返回一个类。”你的意思是它返回一个*对象“,并且该对象是一个远程对象,或者只是一个Serializable对象? – EJP 2010-04-10 06:48:48

回答

3

的​​关键字不执行该功能,而是,​​关键字尝试获取当前对象的固有锁。

让所有客户端自己导出为Remote对象,并注册服务器更新。当你的一个客户更新服务器时,服务器将调用所有注册的Remote客户,要求他们刷新。

这可以通过Observer模式来实现。如果您的所有客户实施java.util.Observer界面,或者服务器或(如果您的班级是Remote),则您关心的更新类可以延伸java.util.Observable。当类/服务器更新时,可以用新值通知观察者,这将节省客户端的一些网络延迟,以便向服务器询问新值。

0

我想了解这个问题。我心里有两个想法:

  1. 要调用getObject()远程调用,然后要更新返回对象,并让它在所有客户端同步。这不会工作。一旦对象传递给客户端,更新仅在该客户端本地。

  2. 您在询问是否可以同步远程呼叫,并且该值一旦更新后便可供所有客户端使用。这里的答案是。的假设是,所有的客户端访问的价值,不在本地,而是通过远程调用:

    public String getStatus() throws RemoteException; 
    

如果是这样的话,那么你的客户端调用,不管他们是否叫set方法,都会收到新的值。

+0

如果他们在更新之后得到它...... – EJP 2010-04-10 06:49:48

+0

我没有提到有关竞争条件的任何信息。 – EJP 2010-04-11 10:40:06