1
循環バッファがスレッドセーフであることを確認したいと思います。私はバッファを使用してデータをBluetooth経由でストリーミングしています。同時に、別のスレッドを使用してデータを削除し、アンドロイドデバイスにローカルに格納しています。循環バッファのスレッドセーフ
これは現在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
正直言って私はあなたがコードをうまく書くと同期が必要なのかどうかはわかりません。なぜあなたは頭の中に読書を書いているのですか? – kingston
頭と尾が同じ場合は0を返すことを確かめていますか?たぶんあなたは整数を返し、その場合nullを返すべきです。 – kingston