【发布时间】:2013-12-22 15:39:03
【问题描述】:
我是 java rmi 新手,但我遇到了同步问题。
服务器处理一个小型数据库 throw 文件(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 要求服务器将学生 2 添加(或任何其他方法)到 univ2。
由于 client2 要求在 univ2 上添加,我预计锁定将占用 univ2,因此线程不会等待,因为 univ2 不像 univ1 那样被锁定。
谁能帮我理解?
任何获得预期行为的建议都将受到欢迎。
谢谢。
【问题讨论】:
标签: java multithreading synchronization rmi