Java锁同步传输方法
您好,我有一个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
//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!");