Java RMI-线程的意外行为
我是JavaRMI新手,在同步方面有问题 服务器处理一个小型数据库抛出文件(7个文件,每个文件代表一所大学) 连接时,客户端提供大学名称,然后选择一个选项:Java RMI-线程的意外行为,java,multithreading,synchronization,rmi,Java,Multithreading,Synchronization,Rmi,我是JavaRMI新手,在同步方面有问题 服务器处理一个小型数据库抛出文件(7个文件,每个文件代表一所大学) 连接时,客户端提供大学名称,然后选择一个选项: 添加一个学生 开除学生 更新学生 寻找学生 一切都很好,但我在同步方面有问题。它没有按我预期的方式工作 假设我们有3个文件,我创建了3个私有静态整数 public class CarnetImpl extends UnicastRemoteObject implements Carnet { private String fa
- 添加一个学生
- 开除学生
- 更新学生
- 寻找学生
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;
这是对同一对象的三个引用,即该类内部缓存中-128和128之间所有值的Integer
实例
如果按照建议的做法使用普通Object
s作为锁,则可以避免这种情况
我还应该指出,您的整个设计是不必要的迂回:因为fac
在实例化时是固定的,所以您最好在该点将适当的锁对象分配给实例变量,而不是在每次方法调用时进行决策级联