有两个线程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
答案 0 :(得分:4)
请记住,只有一个线程写入 ArrayList,因此问题不应与同步有关。
根据ArrayList的javadoc:
,这根本不是真的请注意,此实现未同步。如果有多个线程 同时访问一个ArrayList实例,并且至少有一个 线程在结构上修改列表,必须同步 外部
您有多个线程同时访问ArrayList,其中一个正在从结构上修改列表。