通过 RMI 从本地计算机上的多个线程调用线程安全方法是否安全?

St.*_*rio 2 java multithreading rmi

我有一些方法将通过 RMI 调用远程方法,如下所示:

/**
 * Implementation is supposed to be thread safe
 */
public interface Act extends java.rmi.Remote{
    String doSome() throws RemoteException;
}

public class SomeClass {
    private static final Act stub = (Act) Naming.lookup("/server/stub")

    public static void someMethodAccessedByMultipleThreads(){
        System.out.println(stub.doSome());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果远程方法是线程安全的,那么someMethodAccessedByMultipleThreads多线程调用是否安全?

或者是否存在一些 RMI 线程/网络/其他问题?

use*_*421 6

很难准确地辨别你在说什么,但我会做两个声明。

  1. 远程存根是线程安全的。很多年前,我在[已失效的] RMI 邮件列表上提出了这个问题,答案刻在了 Bob Scheifler、Ann Wolrath、Peter Jones 或其他作者之一的石碑上,不仅是为了 RMI,也是为了整个 RMI。 JDK:除非 Javadoc 另有说明,否则它是线程安全的。

  2. 远程方法实现不是线程安全的此断言的来源是远程方法调用规范中的格言,其大意是 RMI 不保证客户端线程和服务器端线程之间的任何关联。其神秘含义是您不能假设 RMI在服务器上是单线程的。

得出的结论是,如果您的远程方法实现是线程安全的,那么从任何客户端中的多个线程或同时多个客户端调用它也是线程安全的,从 RMI 的角度来看,这相当于同一件事。