我目前正在研究Java RMI的工作原理,但我不了解某个方面
在非分布式多线程环境中,如果同一个对象上的方法同时从不同的线程调用,则每个线程的相应线程将在相应线程的堆栈上执行(访问共享数据不是我的问题的一部分)。
在分布式系统中,因为客户端进程调用存根上的方法,并且在创建远程对象的进程的堆栈上执行实际调用,如何处理对方法的同时调用?换句话说,当有两个(或更多)请求在该线程上执行相同的方法时,在服务器线程中会发生什么?
我想到了这个问题,因为我想将它与我习惯的比较 - 执行在不同的堆栈上。
答案 0 :(得分:2)
如何处理对方法的同时调用?
没有指定。它在RMI specification中经过仔细陈述:" RMI运行时不保证将远程对象调用映射到线程。"
这个隐藏的意思是你不能假设服务器是单线程的。
换句话说,当有两个(或更多)请求在该线程上执行相同的方法时,在服务器线程中会发生什么?
在同一个线程上执行该方法不能有两个或更多请求。这个问题没有意义。您已经提出了一个独特的服务器线程'但实际上并不存在。
然而,可能有两个或更多请求执行该方法,这些请求来自两个或多个并发客户端,或者单个客户端中的两个或更多并发线程,或两者兼而有之,并且由于RMI规范的措辞,您可以&#39 ;假设服务器上有单线程调度模型。
在Oracle / Sun实现中,它确实是多线程的,与IBM实现相同。我不知道任何RMI实现不是多线程的,任何这样的实现基本上都是无用的。