1
我想确保我的循环缓冲区是线程安全的。我正在使用缓冲区来存储通过蓝牙传输的数据,并且同时我正在使用另一个线程删除数据并将其存储在本地Android设备中。循环缓冲区的线程安全
这是我当前的CircularBuffer
使用Semaphore
。是否可以通过简单地将添加到每种方法来使其通过验证?这将是我首选的方法。
public class CircularBuffer {
// private byte[][] data;
private int data[];
private int head;
private int tail;
private Semaphore readPermission;
public CircularBuffer(Integer number) {
// data = new byte[number][];
readPermission = new Semaphore(1);
data = new int[number];
head = 0;
tail = 0;
}
public boolean store(byte[] value) {
if (!bufferFull()) {
ByteBuffer bb = ByteBuffer.wrap(value);
// may need to be reversed
int intVal = bb.getShort();
Log.i("Buffer Input", "" + intVal);
// data[tail++] = value;
data[tail++] = intVal;
if (tail == data.length) {
tail = 0;
}
return true;
} else {
return false;
}
}
public int getSize() {
return tail - head;
}
public int read() {
Log.i("Buffer", "Taking");
if (head != tail) {
// byte[] value = data[head++];
int value=data[head++];
if (head == data.length) {
head = 0;
}
return value;
} else {
//return null;
return 0;
}
}
//Getting permission using a semaphore
public void getPermission(){
try {
readPermission.acquire();
} catch (InterruptedException e) {
Log.i("Buffer", "Interrupted Exception");
e.printStackTrace();
}
}
//Giving up permission using a semaphore
public void givePersmission(){
readPermission.release();
}
}
如果线程安全性不好,应用程序可能会崩溃吗? – gtdevel 2012-02-14 22:02:21
说实话,我不确定如果你写好代码,同步化是必要的。顺便说一句,你为什么在尾巴上写下头部的读数? – kingston 2012-02-15 19:40:29
如果头部和尾部相同,你确定你的cn返回0吗?也许你应该返回一个Integer,并在这种情况下返回null。 – kingston 2012-02-15 19:41:57