2014-10-20 1 views
0

내 코드에는 DataLogger이라는 객체가 있습니다. 이름에서 알 수 있듯이 파일에 데이터 로깅을 담당합니다.기본 DataLogger 구현

클래스의 골격은 다음과 같습니다

class DataLogger { 

    private BufferedWriter mFileWriter = ... 
    private boolean mRunning = false; 

    //constructor 
    public DataLogger() { 
    //init stuff 
    } 

    public void onEvent(..) { 
    //... 
    if(mRunning) { 
     mFileWriter.write(...); 
    } 
    /... 
    } 

    public void start() { 
    //startdata logging 
    mRunning = true; 
    } 

    public void stop() { 
    //stop data logging 
    mRunning = false; 
    //closing File writer etc. 
    } 
} 

그래서 개체가 onEvent 방법 Events를받습니다. 새 이벤트가 올 때마다 데이터가 파일에 기록됩니다. 데이터 로거는 start() 메서드로 시작하고 stop() 메서드로 중지해야합니다. 이 코드에서 볼 수있는 문제는 DataLogger의 클라이언트/호출자가 stop()을 호출하면 사용자가 stop()을 호출 했음에도 불구하고 이벤트가 방금 로깅 될 동일한 순간에 도착할 수 있다는 것입니다. 데이터 스트림이 이미 닫힌 경우에도 충돌이 발생할 수 있습니다. 내가 몇 가지 synchornization을 추가 할 필요가/여기 코드를 잠금이 맞나요? 내 코드를 확장하는 가장 좋은 방법은 무엇입니까?

답변

1

가장 직접적인 해결책은 onEvent()와 stop()을 동기화하는 것입니다. 그렇게하면 두 가지 방법 중 하나만이 동시에 호출되어 초기 문제를 해결할 수 있습니다.

public void onEvent(..) { 
public void start() { 
public void stop() { 

public synchronized void onEvent(..) { 
public synchronized void start() { 
public synchronized void stop() { 
된다