Java 两个线程调用相同的代码,即使它是同步的
我得到一个例外:Java 两个线程调用相同的代码,即使它是同步的,java,multithreading,Java,Multithreading,我得到一个例外: Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) 例外情况是当我试图从列表中删除元素,然后得到第一个元素。问题是,当列表中已经没有元素时,线程想要访问第一个
Exception in thread "Thread-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
例外情况是当我试图从列表中删除元素,然后得到第一个元素。问题是,当列表中已经没有元素时,线程想要访问第一个元素。但我确实在方法存根中放入了synchronized
。怎么了
private static ArrayList<Pracownik> LIST;
public static synchronized void roll(){
if (LIST.size() > 0) {
LISTA.remove(0);//removing from list
String initials = LISTA.get(0).getInijcaly(); //here is exception
}
}
私有静态数组列表;
公共静态同步无效卷(){
如果(LIST.size()>0){
LISTA.remove(0);//从列表中删除
String initials=LISTA.get(0.getInijcaly();//这里是异常
}
}
这不一定是线程问题
再次查看调用顺序:
// check that the list has at least 1 element
if (ISTA.size() > 0) {
// remove 1 element
LISTA.remove(0);
// list might have 0 elements at this point
LISTA.get(0);
}
在这里,您检查列表是否至少有1个元素,然后删除一个元素,然后尝试检索另一个元素。如果列表大小为1,则会引发异常
这是假设ISTA
/LIST
/LISTA
都是相同的东西,这些只是打字错误。(否则,如果它们不同,则您正在检查错误列表的大小…)
代码片段太小,无法说明正确的修复方法是什么,坦率地说,它对您来说应该是微不足道的
您需要:
- 在访问这两个内容之前,请检查列表中是否至少包含两个内容
- 检查是否至少有一个对象,并且只能访问一个对象
if (LISTA.size() > 0) {
LISTA.remove(0);
if(LISTA.size() >= 1){
LISTA.get(0).getInijcaly();
}
}
你怎么称呼这个代码。另外,
LISTA.size()
看起来会通过NPECA告诉我们错误发生在哪一行请?您正在从列表中删除元素,如果这是最后一个元素,您将在下一行尝试从空列表中检索元素。