我有一些方法将通过 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 线程/网络/其他问题?
最佳答案
很难准确地辨别你在说什么,但我会做两个声明。
远程 stub 是线程安全的。很多年前,我在 [已失效的] RMI 邮件列表上问过这个问题,答案刻在 Bob Scheifler、Ann Wolrath、Peter Jones 或其他作者之一的石碑上,不仅针对 RMI,而且针对整个JDK:除非 Javadoc 另有说明,否则它是线程安全的。
远程方法实现不是线程安全的。这个断言的来源是远程方法调用规范中的 gnomic 语句,大意是 RMI 不保证客户端线程和服务器端线程之间的任何关联。这其中的神秘含义是您不能假设 RMI 在服务器上是单线程的。
要得出的结论是,如果您的远程方法实现是线程安全的,那么从任何客户端中的多个线程或同时从多个客户端调用它也是如此,这与来自RMI的观点。
关于java - 从本地机器上的多个线程通过 RMI 调用线程安全方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43537640/