2009-08-10 2 views
1

일부 분산 알고리즘을 구현하기 위해 RMI를 사용하고 있으며, 상당히 큰 객체를 전송하기 때문에 RMI가 네트워크를 통해 직렬화 된 객체를 전송할 때 몇 가지 정밀함을 원합니다.Java RMI를 사용하면 네트워크를 통해 직렬화 된 객체가 정확히 전송되는 시점은 언제입니까?

다음 방법으로 원격 클래스가 있다고 가정합니다.

class MyServer extends Remote { 
    public synchronized void foo (Bar bar) { 
     ... 
     Thread.wait(); 
     ... 
    } 
} 

이제 두 개 이상의 RMI 클라이언트가 MyServer.foo 메서드를 호출합니다. 클라이언트 1이 호출하면 스레드가 차단됩니다 (). 그런 다음 클라이언트 2foo으로 전화를 걸고 클라이언트 1은 여전히 ​​동기화 된 foo 메서드에 있기 때문에 차단됩니다. 이제

, 질문은 : 네트워크를 통해 전송되는 클라이언트 2 전화의 매개 변수가 언제입니까? 클라이언트 2은 실제로 차단 된 경우 foo 방법을 입력 할 수 있습니까?

보너스 질문 : RMI 사양에 따라 시행되는 동작입니까, 구현에 따른 동작입니까?

+0

이 코드는 컴파일되지 않습니다. 네가 묻고있는 것이 불분명하다. – EJP

답변

1

예제에 몇 가지 문제가있는 것으로 보입니다.

Thread.wait()는 실제로 this.wait()라고 가정합니다. 스레드에 그러한 메소드가 없기 때문에 this.wait()라고 가정합니다. 그리고 대기는 동기화를 수행하는 데 사용되는 것과 동일한 객체에서 호출되어야합니다.

이렇게 가정하면 클라이언트 1이 lock.wait()를 호출하면 동기화 블록의 모니터가 해제됩니다. 즉, 클라이언트 2가 메소드에 액세스 할 수 있고 결국 동일한 대기 메소드에서 차단됩니다. 다른 스레드가 MyServer의 동일한 인스턴스에서 notify()를 호출하면 wait()가 해제됩니다.

직렬화는이 메서드가 호출되기 전에 발생합니다. 이 메소드를 호출하는 RMI 코드 내에서 발생했을 가능성이 있습니다.

+0

'Thread.wait()'은 실제로 메소드이지만,'Object.wait()'에서 상속되며 분명히 잘못된 호출입니다. – EJP

1

bar 매개 변수는 RMI 프로토콜의 일부인 foo 메서드를 호출하는 요청과 동일한 요청으로 전송됩니다.

관련 문제