读取ArrayList的最后一个索引时返回null

时间:2014-06-22 20:42:54

标签: java arraylist

有两个线程A和B.A继续写入ArrayList,B继续读取它。以下代码用于读取ArrayList并属于线程B。

此代码的问题在于,有时两个IF语句都变为true,这是不可能的。第一个IF用于确保列表不会超出其大小。 第二个IF不是实际代码的一部分。我把它仅用于验证目的。正如您在下面的输出中看到的,列表的大小大于writeNext变量,我不明白为什么返回null。是的,如果我在第一个IF之后放置一个打印语句或一个非常小的延迟,一切正常。请记住,只有一个线程写入ArrayList,因此问题不应与同步有关。

 public void run() {// thread B

public class WriteTicksToFile implements Runnable, Serializable {

    int writeNext = 0;

    @Override
    public void run() {

        while (true) {

            // read till writeNext is equal to ArrayList.size()-1 i.e. the last index
            if (writeNext < TickData.getCompleteTickList().size()) {

                // System.out.println(TickData.getCompleteTickList().size()+" "+writeNext);
                if (TickData.getCompleteTickList().get(writeNext) == null) {

                    System.out.println("ListSize: " + TickData.getCompleteTickList().size() + " " + "Read@Index: " + writeNext);

                }// if ends

                // write element to file.
                writeTick(TickData.getCompleteTickList().get(writeNext));
                writeNext++;
            }// if ends
        }// while ends
    }
}

输出

Number of symbols found: 19
Market Opening time: 81500
Market Closing time: 235900
Current Time: 203931
Waiting for market to open...
Market Opened @ 203931
ListSize: 15876 Read@Index: 15875
ListSize: 15877 Read@Index: 15876

1 个答案:

答案 0 :(得分:4)

  

请记住,只有一个线程写入   ArrayList,因此问题不应与同步有关。

根据ArrayList的javadoc:

,这根本不是真的
  

请注意,此实现未同步。如果有多个线程   同时访问一个ArrayList实例,并且至少有一个   线程在结构上修改列表,必须同步   外部

您有多个线程同时访问ArrayList,其中一个正在从结构上修改列表。