2012-02-14 134 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