FileLock

Java에서 File에 락을 걸기위한 방법으로 FileLock이라는 것을 사용할 수 있다.

File file = new File("D:\\data\\people.txt");
FileChannel channel = null;
try {
channel = new FileOutputStream(file).getChannel();
FileLock fileLock = channel.tryLock();
fileLock.release();
} catch (IOException e) {
e.printStackTrace();
}

다음과 같이 한다. 락을 걸고 사용 후에는 해제를 해줘야 한다.


락을 확보했다가 해제하는 것을 100만번 반복하는데 1000 밀리초 정도 걸렸다. (Intel i7-4790 3.60GHz)


락을 확보한 상태에서 다른 프로세스에서 파일을 지우려고 하면 OS별로 결과가 달랐다.

- 윈도우(윈도우 7) : JVM에서 사용중이라는 메시지가 뜨며 삭제되지 않음

- 리눅스(CentOS) : 삭제 가능함


하지만 자바 JVM 간에는 락이 호환되서 서로 다른 프로세스라도 락 확보가 되지 않았다.(윈도우, 리눅스 모두)


중요한 것은 같은 JVM의 여러 스레드 간에 파일 제어를 위한 목적으로는 적합하지 않다고 한다.

이유는? 아직 모르겠다.


꼭 락을 확보한 스레드에서만 락을 해제할 수 있는 것은 아니다. 락 확보 시 획득한 FileLock 객체만 있다면 다른 스레드에서도 락 해제를 할 수 있다.


락 확보를 위한 메소드 종류가 두 가지 있다.

- lock : 블로킹 메소드. 락을 확보할 때까지 기다린다. 대기 중 인터럽트 될 수 있다.

- tryLock : 논블로킹 메소드. 락 확보 실패 시 null이 리턴된다.