Java RMI-线程的意外行为

Java RMI-线程的意外行为,java,multithreading,synchronization,rmi,Java,Multithreading,Synchronization,Rmi,我是JavaRMI新手,在同步方面有问题 服务器处理一个小型数据库抛出文件(7个文件,每个文件代表一所大学) 连接时,客户端提供大学名称,然后选择一个选项: 添加一个学生 开除学生 更新学生 寻找学生 一切都很好,但我在同步方面有问题。它没有按我预期的方式工作 假设我们有3个文件,我创建了3个私有静态整数 public class CarnetImpl extends UnicastRemoteObject implements Carnet { private String fa

我是JavaRMI新手,在同步方面有问题

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

连接时,客户端提供大学名称,然后选择一个选项:

  • 添加一个学生

  • 开除学生

  • 更新学生

  • 寻找学生

一切都很好,但我在同步方面有问题。它没有按我预期的方式工作

假设我们有3个文件,我创建了3个私有静态整数

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
在实例化时是固定的,所以您最好在该点将适当的锁对象分配给实例变量,而不是在每次方法调用时进行决策级联