2010-04-10 5 views
2

'서버'에 저장된 클래스가 있고 여러 클라이언트가이 메서드를 호출 할 수 있습니다. 이 메소드는 클래스를 리턴합니다. 이제 클라이언트가이 클래스에서 접근 자 메서드를 호출 할 때 예를 들어 접근 자 설정 메서드가 호출됩니다. 서버의 개체를 다른 모든 클라이언트에서 업데이트하고 동기화하려고합니다.자바 RMI 메서드 동기화

어떻게 사용합니까 : 자바 내에서

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

이를 달성하기 위해.

감사

+0

"이 메서드는 클래스를 반환합니다." 오브젝트를 돌려주는 것을 의미합니까? 그리고 그 오브젝트는 리모트 오브젝트입니까, 또는 단지 Serializable 오브젝트입니까? – EJP

답변

3

synchronized 키워드가이 기능을 수행하지 않습니다는 오히려 synchronized 키워드는 현재 개체에 대한 고유 잠금을 시도합니다.

모든 클라이언트가 자신을 Remote 개체로 내 보내고 서버에 업데이트를 등록하십시오. 클라이언트 중 하나가 서버를 업데이트하면 서버는 등록 된 모든 Remote 클라이언트를 호출하여 새로 고침을 요청합니다.

이것은 Observer 패턴으로 얻을 수 있습니다. 모든 클라이언트가 java.util.Observer 인터페이스를 구현하고 서버 또는 (클래스가 Remote 인 경우) 업데이트와 관련된 클래스는 java.util.Observable까지 확장 할 수 있습니다. 클래스/서버가 업데이트되면 Observers에 새 값이 통지 될 수 있습니다. 그러면 서버에 새로운 값을 요청하는 클라이언트의 네트워크 지연이 줄어 듭니다.

0

나는이 질문을 이해하려고 애 쓰고있다. 나는 마음에 두 가지 아이디어가 있습니다

  1. 당신이 getObject() 원격 호출을 호출 한 다음 반환 된 개체를 업데이트 할하고 모든 클라이언트에서 동기화해야합니다. 이 일은 실 거예요. 개체가 클라이언트에 전달되면 업데이트는 해당 클라이언트에만 국한됩니다.

  2. 원격 통화를 동기화 할 수 있는지 여부를 묻는 메시지가 표시되면 업데이트 된 모든 클라이언트가이 값을 사용할 수 있는지 확인해야합니다. 대답은 입니다. 가정은 모든 클라이언트는 로컬이 아닌 값에 접근하지만되어있는 원격 호출을 통해 : 그 경우

    public String getStatus() throws RemoteException; 
    

경우, 다음 클라이언트 호출에 관계없이이 set이라고 여부 메소드는 모두 새 값을받습니다.

+0

업데이트 후에 얻는 경우 ... – EJP

+0

경주 조건에 대해서는 아무 말도하지 않았습니다. – EJP