我有一个ArrayList用于缓存数据,以便其他线程可以读取它们。
由于它从UDP源读取,因此这个数组不断地添加数据,而其他线程不断地从该数组中读取。然后从数组中删除数据。
这不是实际的代码,而是一个简化的例子:
public class PacketReader implements Runnable{
pubic static ArrayList<Packet> buffer = new ArrayList() ;
@Override
public void run(){
while(bActive){
//read from udp source and add data to the array
}
}
public class Player implements Runnable(){
@Override
public void run(){
//read packet from buffer
//decode packets
// now for the problem :
PacketReader.buffer.remove(the packet that's been read);
}
}
remove() 方法从数组中删除数据包,然后将右侧的所有数据包向左移动以覆盖空白位置。
我的担忧是:由于缓冲区不断地被多个线程添加和读取,那么 remove() 方法会出现问题吗?因为它需要将数据包向左移动。
我的意思是,如果在进行移动的同时调用了 .add() 或 .get() 方法,这会成为一个问题吗?
有时候我会得到“index out of bounds”异常,例如:索引为100、大小为300,这很奇怪,因为索引在大小之内,所以我想知道是否可能是这个问题导致的,还是应该寻找其他问题。
谢谢。
ConcurrentModificationException
是多个访问结构的症状,这些访问被组织得足够好,以至于实现可以检测到它们。对于这种不受控制的并行访问,我预计会出现错误的答案。 - Patricia Shanahan