2012-02-14 129 views
1

我想确保我的循环缓冲区是线程安全的。我正在使用缓冲区来存储通过蓝牙传输的数据,并且同时我正在使用另一个线程删除数据并将其存储在本地Android设备中。循环缓冲区的线程安全

这是我当前的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

因为您只需要一个互斥访问同步就可以了,但您不需要在所有方法上都使用它。只有真正需要同步的方法, 如果使用信号量,请确保您编写了excelltion安全代码,以确保无论发生什么情况,都将释放信号量。 从这个角度来看,互斥体更安全。

+0

如果线程安全性不好,应用程序可能会崩溃吗? – gtdevel 2012-02-14 22:02:21

+0

说实话,我不确定如果你写好代码,同步化是必要的。顺便说一句,你为什么在尾巴上写下头部的读数? – kingston 2012-02-15 19:40:29

+0

如果头部和尾部相同,你确定你的cn返回0吗?也许你应该返回一个Integer,并在这种情况下返回null。 – kingston 2012-02-15 19:41:57