我有 2 个线程,一个插入数据,第二个线程检索数据。
我得到了非常奇怪的结果。
线程安全吗?
如果不行,如何解决?
这是我的循环缓冲区:
private int mBufferSize;
private int startPointer = 0;
private int endPointer = 0;
private int bufferSize = 0;
private String[] buffer;
public BBuffer(int size) {
mBufferSize = size;
startPointer = 0;
endPointer = 0;
bufferSize = 0;
buffer = new String[mBufferSize];
}
public String[] getData() {
String data = null;
if (!isEmpty()) {
bufferSize--;
startPointer = (startPointer + 1) % mBufferSize;
data = (String) buffer[startPointer];
} else {
System.err.println("!");
return null;
}
return data.split(",");
}
public void addData(String data) {
if (!isFull()) {
bufferSize++;
endPointer = (endPointer + 1) % mBufferSize;
buffer[endPointer] = data;
System.out.println("->"+data);
} else {
System.out.println("full");
}
}
public boolean isEmpty() {
return bufferSize == 0;
}
public boolean isFull() {
return bufferSize == mBufferSize;
}
}
最佳答案
根本不是线程安全的。
您只需将 synchronized
关键字添加到 4 个方法的声明中即可。您很幸运,这样一个简单的解决方案适用于您的类(class),因为情况并非总是如此。
一个潜在的棘手问题是 getData
返回的 String[]
。您在每次调用时都会创建一个新数组,因此不会有任何问题,但如果它返回了对内部数组的一些引用,同步就会很复杂。
关于java - 线程安全的循环缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422184/