2010-04-10 109 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