Java RMI和线程同步问题

Inf*_*f.S 5 java multithreading rmi synchronized

我实际上有两个关于Java RMI和线程同步的问题:

1)如果我将RMI远程方法实现为同步,它们是否保证互斥?我需要确保没有两个我的RMI方法(提供给客户端的方法)同时执行.

2)我有一个服务器定期执行的方法.它用于清理.当远程客户端运行/使用任何RMI方法时,我必须确保不执行此特定方法.此外,当该方法运行时,不应该进行RMI调用.即客户必须等待.知道我怎么能这样做吗?我读过有关Locks的内容,但我不知道如何在这种情况下使用它们.

我已经考虑过将RMI方法实现为静态并在RMI接口中包含清理方法,但它似乎并不是解决问题的优雅方法.

我还在RMI接口中将cleanup方法编写为synchronized.当我运行它进行测试时,方法之间似乎没有冲突,但我无法确定.

谢谢你的时间和答案.

ewe*_*nli 11

1)如果我将RMI远程方法实现为同步,它们是否保证互斥?我需要确保没有两个我的RMI方法(提供给客户端的方法)同时执行.

RMI本身不提供此类保证(与EJB不同),并且可以同时执行对同一远程对象的两次调用,除非您实现某些同步.您的方法是正确的,并且同步所有方法确实将确保它们中没有两个同时在同一对象上运行.注意:synchronized仅关键字相当于synchronized( this ).

2)我有一个服务器定期执行的方法.它用于清理.当远程客户端运行/使用任何RMI方法时,我必须确保不执行此特定方法.

如果清理作业位于另一个类中,则需要定义将在远程对象和清理作业之间共享的锁.在远程对象中,定义将用作锁的实例变量.

protected Object lock = new Object();
Run Code Online (Sandbox Code Playgroud)

按照惯例,人们Object为此目的使用.然后你需要在你的定期工作中获取锁定synchronized( remoteObj.lock ) { ... },假设它在同一个包中.

远程对象中的其他方法需要以相同的方式同步(synchronized单独是不够的),因此远程方法调用和定期作业都是独占的.

我已经考虑过将RMI方法实现为静态并在RMI接口中包含清理方法,但它似乎并不是解决问题的优雅方法.

我还在RMI接口中将cleanup方法编写为synchronized.当我运行它进行测试时,方法之间似乎没有冲突,但我无法确定.

如果我理解得很好,你想让清理逻辑成为静态方法吗?synchronized单独的静态方法可以锁定类.一个"常规"方法,synchronized用于获取对象实例的锁定.这些隐式锁不一样!

但是如果你只有一个远程对象被实例化,你可以使锁定为静态(这与锁定类相同,但更清晰).然后,清理代码也可以是静态的,并且与远程对象在同一类中.

骨架:

public class MyRemoteClass {
   public static Object lock = new Object();

   public void doStuff()
   {
       synchronized( lock ) { ... }
   }
}

public class Cleanup {
   public static void doIt()
   {
       synchronized( MyRemoteClass.lock ) { ... }
   }
}
Run Code Online (Sandbox Code Playgroud)