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告诉我们错误发生在哪一行请?您正在从列表中删除元素,如果这是最后一个元素,您将在下一行尝试从空列表中检索元素。