我有一个 Arraylist,我不断地在单独的线程中添加和删除它。 一个线程添加,另一个线程删除。
这是包含更改列表的类:
public class DataReceiver {
private static final String DEBUG_TAG = "DataReceiver";
// Class variables
private volatile ArrayList<Byte> buffer;
//private volatile Semaphore dataAmount;
public DataReceiver() {
this.buffer = new ArrayList<Byte>();
//this.dataAmount = new Semaphore(0, true);
}
// Adds a data sample to the data buffer.
public final void addData(byte[] newData, int bytes) {
int newDataPos = 0;
// While there is still data
while(newDataPos < bytes) {
// Fill data buffer array with new data
buffer.add(newData[newDataPos]);
newDataPos++;
//dataAmount.release();
}
return;
}
public synchronized byte getDataByte() {
/*
try {
dataAmount.acquire();
}
catch(InterruptedException e) {
return 0;
}
*/
while(buffer.size() == 0) {
try {
Thread.sleep(250);
}
catch(Exception e) {
Log.d(DEBUG_TAG, "getDataByte: failed to sleep");
}
}
return buffer.remove(0);
}
}
问题是我在尝试 buffer.remove(0)
时经常遇到空指针异常。从代码中的注释中可以看出,我曾尝试使用信号量,但它仍然间歇性地抛出空指针异常,因此我创建了自己的 sleep 轮询类型作为半概念验证。
我不明白为什么会出现空指针异常和/或如何修复它。
最佳答案
如果您在不同的线程中处理对象初始化,则构造函数可能在
public synchronized byte getDataByte()
被调用因此导致 NullPointerException
因为
this.buffer = new ArrayList<Byte>();
从未被调用过。
关于java - 列出并发失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19691767/