1
순환 버퍼가 스레드로부터 안전한지 확인하고 싶습니다. 데이터를 저장하기 위해 버퍼를 사용하고 있으며, 동시에 다른 스레드를 사용하여 데이터를 제거하고 Android 장치에 로컬로 저장합니다.순환 버퍼의 스레드 안전
이것은 현재 나의 CircularBuffer
이고 Semaphore
입니다. 모든 방법에 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();
}
}
스레드 안전성이 좋지 않으면 응용 프로그램이 중단 될 수 있습니까? – gtdevel
솔직히 말해서 나는 코드를 잘 작성하면 synchroniz
kingston
머리와 꼬리가 동일하면 0을 반환해야합니까? 어쩌면 Integer를 반환하고 그 경우 null을 반환해야합니다. – kingston