gpt4 book ai didi

Java RMI-线程的意外行为

转载 作者:行者123 更新时间:2023-11-29 05:32:09 25 4
gpt4 key购买 nike

我是 java rmi 的新手,我遇到了同步问题。

服务器处理一个小型数据库抛出文件(7个文件,每个代表一所大学),

连接时客户端给出大学名称然后选择一个选项:

  • 添加学生

  • 删除学生

  • 更新一个学生

  • 搜索学生

一切正常,但我遇到了同步问题。它没有按我预期的方式工作。

假设我们有 3 个文件,我创建了 3 个私有(private)静态整数来像这样使用

public class CarnetImpl extends UnicastRemoteObject implements Carnet {

private String fac;
private static Integer univ1=1;
private static Integer univ2=1;
private static Integer univ3=1;

CarnetImpl(String fac) throws RemoteException {
this.fac=fac;
}
public void add(Student e) throws RemoteException {
Integer lock=1
switch (fac){
case "univ1":
lock=univ1;
break;

case "univ2":
lock=univ2;
break;

case "univ3":
lock=univ3;
break;
}
synchronized(lock){
//creating a file named "fac.txt" (fac can be univ1,2 or3) and adding a student
}
}
}

我对其他方法做了同样的事情。

我期望的是,对于给定的大学,只有一个客户可以使用一种方法,而多个客户可以同时对不同的大学使用相同的方法。

但经过测试,似乎即使对于不同的大学,客户端也必须等待另一个完成才能使用该方法。

示例:

客户端 1 要求服务器将 student1 添加到 univ1(我添加了一个 5' sleep 和一个 println 来检测线程行为)。

在 5 秒结束之前,客户端 2 要求服务器将 student2 添加(或任何其他方法)到 univ2。

当 client2 在 univ2 上请求添加时,我预计锁将占用 univ2,因此线程不会等待,因为 univ2 不像 univ1 那样未被锁定。

谁能帮我理解一下?

我们非常欢迎任何获得预期行为的建议。

谢谢。

最佳答案

private static Integer univ1=1;
private static Integer univ2=1;
private static Integer univ3=1;

这是对同一个对象的三个引用,Integer 实例来自该类的内部缓存,所有值介于 -128 和 128 之间。

如果您遵循推荐的做法使用普通 Object 进行锁定,您就可以避免这种情况。

我还应该评论说你的整个设计是不必要的迂回:因为 fac 在实例化时是固定的,你最好在那个时候将正确的锁对象分配给实例变量而不是去通过每个方法调用的决策级联。

关于Java RMI-线程的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20731033/

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