2013-05-18 2 views
1

내 애플리케이션에서 파일을 읽고 쓰는 경우가 있습니다. 그리고이 작업은 다중 스레드에서 발생할 수 있으므로 이러한 자원을 동기화해야합니다. 여기 내 코드는 다음과 같습니다.Android : 올바른 방법으로 리소스를 동기화하는 방법

// write to file 
FileOutputStream fos = openFileOutput("data.dat", Context.MODE_PRIVATE); 
synchronized (fos) { 
    ObjectOutputStream writer = new ObjectOutputStream(fos);  
    // continue to write 
} 

// read to file 
FileInputStream fis = openFileInput("data.dat"); 
synchronized (fis) { 
    ObjectInputStream reader = new ObjectInputStream(fis); 
    // continue to read 
} 

위 코드가 안전합니까? 즉 "data.dat"은 항상 읽기 또는 쓰기가 가능하며 한 스레드에서만 가능합니다. 잘못하면 제게 맞습니다.

감사합니다 :)

+0

두 가지 문제가 있습니다. 두 개의 잠금이 같지 않으므로 파일을 읽고 쓰는 것이 상호 배타적이지 않습니다. 더욱 중요한 것은 로컬 변수를 잠금으로 사용하여 목적을 완전히 무너 뜨리는 것입니다. 각 스레드는 다른 잠금을 가지며 동시 액세스는 차단되지 않습니다. – assylias

+0

@assylias 그래서 아이디어를 추천 해 주시겠습니까? 그 방법을 사용하지 않고 다른 스레드가 해당 자원에 액세스 할 수 있기 때문에 메소드 만 동기화 할 수는 없습니다. 감사합니다 :) – hqt

+0

이것들은 인스턴스 메소드 (static이 아닌)라고 가정하면 클래스에 private final Object lock = new Object();를 선언하고이를 잠금으로 사용할 수 있습니다. 그런 식으로 모든 스레드가 코드의 두 부분으로 모든 액세스를 배제합니다. – assylias

답변

2

사용하여 파일 잠금 : http://en.wikipedia.org/wiki/File_locking는 출력 파일이 사용 중임을 다른 스레드에게 있습니다. 출력 파일이 앱에서 독점적으로 사용되는 경우 synchronized은 다른 스레드가 동시에 해당 코드 부분을 수행하지 못하게해야합니다. 또는 IntentService을 사용하여 요청을 대기열에 넣고 하나씩 처리하는 방법을 고려할 수 있습니다.

+0

'FileLock'을 사용하면 리소스가 잠금 해제 될 때까지 다른 스레드와 프로세스가 모두 대기합니다. 맞습니까? 아니면, 그들은 예외를 던질 것인가? 감사합니다 :) – hqt

+0

그것은 잠금 귀하의 코드를 처리 할 필요가 귀하의 구현에 따라 다릅니다. 특정 리소스 (즉, 파일)에 대한 잠금을 얻으려고 시도하면 작업을 수행 한 다음 잠금을 해제하면됩니다. 잠금을 얻을 수 없다면 기다렸다가 다시 시도하거나 예외를 던지거나 다른 작업을 수행 할 수 있습니다. 그것은 당신에게 달렸습니다. –

관련 문제