2012-02-14 25 views
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(); 
} 

} 

答えて

0

あなたは相互排他アクセスのみを同期する必要はありますが、すべての方法で使用する必要はありません。セマフォを使用する場合は、セマフォをリリースすることを確実にするために、安全なコードを書くようにしてください。 この観点から、ミューテックスはより安全です。

+0

スレッドの安全性がうまくいかないとアプリケーションがクラッシュする可能性はありますか? – gtdevel

+0

正直言って私はあなたがコードをうまく書くと同期が必要なのかどうかはわかりません。なぜあなたは頭の中に読書を書いているのですか? – kingston

+0

頭と尾が同じ場合は0を返すことを確かめていますか?たぶんあなたは整数を返し、その場合nullを返すべきです。 – kingston

関連する問題