【问题标题】:Java RMI- unexpected behavior of threadsJava RMI-线程的意外行为
【发布时间】: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


    【解决方案1】:
    private static Integer univ1=1;
    private static Integer univ2=1;
    private static Integer univ3=1;
    

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

    如果您遵循推荐的做法,使用普通的Objects 作为锁,您就可以避免这种情况。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多