1

循環バッファがスレッドセーフであることを確認したいと思います。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();
}

}
4

1 に答える 1

0

同期された相互排他アクセスのみが必要なため、OKですが、すべてのメソッドで使用する必要はありません。本当に同期する必要があるメソッドのみ。セマフォを使用する場合は、セマフォを確実に解放するために、実行に安全なコードを記述してください。この観点から、ミューテックスはより安全です。

于 2012-02-14T20:40:52.683 に答える