Резьба безопасности Кругового Буфера - PullRequest
1 голос
/ 15 февраля 2012

Я хотел бы убедиться, что мой кольцевой буфер является потокобезопасным.Я использую буфер для хранения данных, передаваемых через Bluetooth, и в то же время я использую другой поток для удаления данных и локального сохранения на устройстве 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();
}

}

1 Ответ

0 голосов
/ 15 февраля 2012

, так как вам нужен только взаимный монопольный доступ, это нормально, но вам не нужно использовать его во всех методах.Только методы, которые действительно должны быть синхронизированы. Если вы используете семафор, убедитесь, что вы пишете код безопасности исключений, чтобы быть уверенным, что вы выпустите семафор, что бы ни случилось.С этой точки зрения мьютекс безопаснее.

...