Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java锁同步传输方法_Java_Multithreading_Synchronization_Locks - Fatal编程技术网

Java锁同步传输方法

Java锁同步传输方法,java,multithreading,synchronization,locks,Java,Multithreading,Synchronization,Locks,您好,我有一个Java应用程序,它接受输入数量的要执行的操作,并为每个操作运行不同的线程: //create operations to execute Thread t[] = new Thread [n_operations]; //we create a Bank with N accounts Bank mybank = new Bank(N); //execute a separate thread per operation for (int i = 0; i < n_op

您好,我有一个Java应用程序,它接受输入数量的要执行的操作,并为每个操作运行不同的线程:

//create operations to execute
Thread t[] = new Thread [n_operations];

//we create a Bank with N accounts
Bank mybank = new Bank(N);

//execute a separate thread per operation
for (int i = 0; i < n_operations; i++) {
    int id = i;
    Operation o = new Operation(mybank, id);
    t[i]= new Thread (o);
    t[i].start();
}
for (int i=0;i<N;i++){
    try{
        t[i].join();
        }catch(Exception e){;}
}
我收到一系列错误,如以下消息:

        at Bank.transfer(Bank.java:28)         /* which is "synchronized (accounts[from]){" */

        at Operation.run(Operation.java:33)    /* which is "b.transfer 
(id,r.nextInt(max),r.nextInt(100));" */

        at java.lang.Thread.run(Unknown Source)
    java.lang.ArrayIndexOutOfBoundsException: 4714
你认为同步可以吗

有什么建议吗?非常感谢


更新(我无法回答自己)

主回路中存在概念错误(对于i..to n_操作), 该函数将“int id=i;”作为源_帐户的参数传递,而n_操作数大于数组的最大值,因此编译器合理地说:ArrayIndexOutOfBoundsException

作为最后的贡献,我想请您检查同步是否正确完成,因为我不是多线程方面的专家。再次感谢您,很抱歉今天早上的问题表达得很糟糕……

编辑:

现在,我们知道以下行是NPE的来源:

b.transfer (id,r.nextInt(max),r.nextInt(100));

所以最有可能的
b
r
null
。您应该在那里放置一个断点,并在其中进行调试,以查看它们是否正确。您还可以使用
assert
或日志来显示值。还请记住,
id
max
如果其中一个是
整数,即
null
并自动装箱,也可能导致NPE


这不会导致您的NPE,但请注意
n_操作
可能不是==100?您正在启动
n_操作
线程,但加入了100个线程:

for (int i=0;i<100;i++){
    try {
        t[i].join();
    } catch(Exception e){;}
}

您在
run()
中使用的一个变量为空,但是哪一个?尝试将以下内容添加到
操作的开头。run()


我假定您在
run()
中显示的行包括第27行。如果没有,请发布
run()

操作:27的完整源代码?哪一行可以为null?查看
Operation.java
类的第27行,并调试当时哪个变量为
null
。第27行是“b.transfer(id,r.nextInt(max),r.nextInt(100));”因此很可能
b
r
为空
id
max
如果其中一个是
Integer
null
并自动装箱,也可能导致NPE。当我删除r的初始化时,r为null,现在应该可以了,但“数组越界”错误仍然存在……这将是加入的错误号码,但这会抛出一个索引超出范围的异常,因为他在数组中没有那么多线程。我没有看到代码顶部的初始化。谢谢。事实上,我甚至没有注意到初始化,所以现在唯一可能发生的事情是,当线程数少于100时,他只能得到一个超出范围的索引异常。好的,谢谢,这100实际上是以前测试的错误,但我仍然有问题。我会用新代码更新我的问题…注意这不会解决你的问题;它只是为了帮助您找出哪些实例变量为null,以便您可以对此采取一些措施。
b.transfer (id,r.nextInt(max),r.nextInt(100));
for (int i=0;i<100;i++){
    try {
        t[i].join();
    } catch(Exception e){;}
}
for (int i = 0; i < t.length; i++) {
    } catch(Exception e){ e.printStackTrace(); }
if(b == null)
  throw new RuntimeException("b is null!");
if(r == null)
  throw new RuntimeException("r is null!");