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

标签 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());
    }
}

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

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

最佳答案

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

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

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

要得出的结论是,如果您的远程方法实现是线程安全的,那么从任何客户端中的多个线程或同时从多个客户端调用它也是如此,这与来自RMI的观点。

关于java - 从本地机器上的多个线程通过 RMI 调用线程安全方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537640/

相关文章:

multithreading - GNU make-如何模拟多个同时作业

java - 在命令行和 Eclipse 中运行 RMI 服务器

远程对象中 javax.json.JsonValue 的 Java RMI NoClassDefFoundError

java - ArrayList不会显示其元素

java - BigDecimal 对大于 7 或 0 小数的数字给出意想不到的结果

java - 如何在每个大写字母之间添加空格?

c# - 服务主机解析 - C# 等同于 RMI 注册表?

java - 旋转对象然后平移它

c++ - ThreadSanitizer 报告的数据竞争

c++ - 为什么c++ std::hash会创建一个仿函数结构体并且可以在每次不创建结构体的情况下调用它