两个线程即使同步也会调用相同的代码

时间:2014-03-31 07:19:59

标签: 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)

,例外是当我尝试从列表中删除元素然后获取第一个元素。问题是,当列表中已经没有元素时,线程想要访问第一个元素。但我确实将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 
        }

    }

2 个答案:

答案 0 :(得分:6)

这不一定是线程问题。

再次查看调用顺序:

// 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都是一样的,那些只是错别字。 (否则,如果它们不同,那么您正在检查错误列表的大小......)

该片段太小,无法确定解决问题的正确方法是什么,坦白地说,解决问题应该是微不足道的。

您需要:

  • 在访问这两件事之前,检查列表中至少有两件事。
  • 检查至少有一件东西,只能访问1件事。

答案 1 :(得分:0)

这是您尝试访问该元素的方式的问题。您可以尝试使用以下方法。

 if (LISTA.size() > 0) {
        LISTA.remove(0);
        if(LISTA.size() >= 1){
            LISTA.get(0).getInijcaly();
        }
    }