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