내 애플리케이션에서 파일을 읽고 쓰는 경우가 있습니다. 그리고이 작업은 다중 스레드에서 발생할 수 있으므로 이러한 자원을 동기화해야합니다. 여기 내 코드는 다음과 같습니다.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"은 항상 읽기 또는 쓰기가 가능하며 한 스레드에서만 가능합니다. 잘못하면 제게 맞습니다.
감사합니다 :)
두 가지 문제가 있습니다. 두 개의 잠금이 같지 않으므로 파일을 읽고 쓰는 것이 상호 배타적이지 않습니다. 더욱 중요한 것은 로컬 변수를 잠금으로 사용하여 목적을 완전히 무너 뜨리는 것입니다. 각 스레드는 다른 잠금을 가지며 동시 액세스는 차단되지 않습니다. – assylias
@assylias 그래서 아이디어를 추천 해 주시겠습니까? 그 방법을 사용하지 않고 다른 스레드가 해당 자원에 액세스 할 수 있기 때문에 메소드 만 동기화 할 수는 없습니다. 감사합니다 :) – hqt
이것들은 인스턴스 메소드 (static이 아닌)라고 가정하면 클래스에 private final Object lock = new Object();를 선언하고이를 잠금으로 사용할 수 있습니다. 그런 식으로 모든 스레드가 코드의 두 부분으로 모든 액세스를 배제합니다. – assylias