2012-02-14 3 views
1

순환 버퍼가 스레드로부터 안전한지 확인하고 싶습니다. 데이터를 저장하기 위해 버퍼를 사용하고 있으며, 동시에 다른 스레드를 사용하여 데이터를 제거하고 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(); 
} 

} 

답변

0

오직 상호 배타적 액세스 동기화 만 필요하지만 모든 방법에서 사용할 필요는 없습니다. 실제로 동기화해야하는 메서드들만 사용하십시오. 세마포어를 사용하는 경우 세마포어를 해제하기 위해 안전 코드를 작성하십시오. 이 관점에서 뮤텍스가 더 안전합니다.

+0

스레드 안전성이 좋지 않으면 응용 프로그램이 중단 될 수 있습니까? – gtdevel

+0

솔직히 말해서 나는 코드를 잘 작성하면 synchroniz kingston

+0

머리와 꼬리가 동일하면 0을 반환해야합니까? 어쩌면 Integer를 반환하고 그 경우 null을 반환해야합니다. – kingston