1) 如果我实现了我的 RMI 遥控器
同步的方法,它们是
保证互斥?一世
需要确保没有我的两个
RMI 方法(提供给
客户端)同时执行。
RMI 本身不提供这样的保证(与 EJB 不同),并且对同一个远程对象的两个调用可能会同时执行,除非您实现了一些同步。您的方法是正确的,同步所有方法确实可以确保它们中的任何一个都不会同时在同一个对象上运行。注意:关键字synchronized单独等同于synchronized( this )。
2) 我有一个方法,服务器
定期执行。它用于
做清理工作。我必须确保
这种特殊的方法不
当有任何 RMI 方法时执行
被远程客户端运行/使用。
如果清理作业在另一个类中,您将需要定义一个锁,您将在远程对象和清理作业之间共享该锁。在远程对象中,定义一个将用作锁的实例变量。
protected Object lock = new Object();
按照惯例,人们为此使用Object。然后你需要使用synchronized( remoteObj.lock ) { ... } 来锁定你的定期工作,假设它在同一个包中。
远程对象中的其他方法需要以同样的方式同步(仅synchronized 是不够的),这样远程方法调用和周期性作业都是独占的。
我考虑过实施 RMI
方法为静态的,包括
RMI 内部的清理方法
界面,但是好像没有
解决问题的优雅方法。
我也写了清理方法
在 RMI 接口内部作为
同步。当我运行它时
测试,好像没有
方法之间的冲突,但我
不能确定。
如果我理解得很好,您想让清理逻辑成为静态方法吗?单独使用 synchronized 的静态方法会获取类的锁。带有synchronized 的“常规”方法会获取对象实例上的锁。这些不是相同的隐式锁!
但是如果你只实例化了一个远程对象,你可以将lock设为静态(这与锁定类相同,但更简洁一些)。清理代码也可以是静态的,并且与远程对象在同一个类中。
骨架:
public class MyRemoteClass {
public static Object lock = new Object();
public void doStuff()
{
synchronized( lock ) { ... }
}
}
public class Cleanup {
public static void doIt()
{
synchronized( MyRemoteClass.lock ) { ... }
}
}