Android 循环缓冲区的线程安全
我想确保我的循环缓冲区是线程安全的。我正在使用缓冲区来存储通过蓝牙传输的数据,同时我正在使用另一个线程来删除数据并在android设备中本地存储 这是我当前使用的Android 循环缓冲区的线程安全,android,thread-safety,synchronized,circular-buffer,Android,Thread Safety,Synchronized,Circular Buffer,我想确保我的循环缓冲区是线程安全的。我正在使用缓冲区来存储通过蓝牙传输的数据,同时我正在使用另一个线程来删除数据并在android设备中本地存储 这是我当前使用的信号灯的CircularBuffer。通过简单地将synchronized添加到每个方法中,是否可以使其具有线程保护功能?那将是我首选的方法 public class CircularBuffer { // private byte[][] data; private int data[]; private int head; priv
信号灯的CircularBuffer
。通过简单地将synchronized
添加到每个方法中,是否可以使其具有线程保护功能?那将是我首选的方法
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();
}
}
因为您只需要一个互斥访问同步是可以的,但是您不需要在所有方法上使用它。只有真正需要同步的方法,
如果使用信号量,请确保编写了异常安全的代码,以确保无论发生什么情况,都会释放信号量。
从这个角度来看,互斥锁更安全。如果线程安全性不好,应用程序可能会崩溃吗?老实说,我不确定如果代码写得好,同步器是否会同步。如果头部和尾部相同,是否确定返回0?在这种情况下,您可能应该返回一个整数并返回null。检查“if(!bufferFull()){”应该检查循环缓冲区,这是什么?看看有没有更好的方法来实现类似的内容