gpt4 book ai didi

Java RMI 和线程同步问题

转载 作者:搜寻专家 更新时间:2023-10-31 08:24:51 24 4
gpt4 key购买 nike

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

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

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

我考虑过将 RMI 方法实现为静态方法,并将该清理方法包含在 RMI 接口(interface)中,但这似乎不是解决问题的优雅方法。

我还在 RMI 接口(interface)内部编写了同步的清理方法。当我运行它进行测试时,方法之间似乎没有冲突,但我不能确定。

感谢您的宝贵时间和回答。

最佳答案

1) If I implement my RMI remote methods as synchronized, are they guaranteed to be mutually exclusive? I need to make sure that no two of my RMI methods (methods offered to clients) execute at the same time.

RMI 本身不提供这种保证(与 EJB 不同),除非您实现某种同步,否则对同一个远程对象的两个调用可能会同时执行。您的方法是正确的,同步所有方法确实可以确保它们中没有两个同时在同一对象上运行。注意:关键字 synchronized 单独等同于 synchronized( this )

2) I have a method that the server executes periodically. It is used to do cleanups. I have to make sure that this particular method does not execute when there is any RMI method being run/used by remote clients.

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

protected Object lock = new Object();

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

远程对象中的其他方法将需要以相同的方式同步(仅synchronized 是不够的),因此远程方法调用和周期性作业都是互斥的。

I have considered implementing RMI methods as static and including that cleanup method inside the RMI interface, but it does not seem to be an elegant way of solving the problem.

I have also written the cleanup method inside the RMI interface as synchronized. When I ran it for testing, there did not seem to be collisions between methods, but I cannot be sure.

如果我理解得很好,你希望清理逻辑是一个静态方法吗?单独使用 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 ) { ... }
}
}

关于Java RMI 和线程同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2275868/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com