반응형
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이 리턴된다.
반응형
'개발 > 자바' 카테고리의 다른 글
JSON 스키마 (0) | 2017.06.30 |
---|---|
JSON STREAMING API (0) | 2017.06.30 |
checked exception과 unchecked exception (0) | 2016.07.18 |
Mybatis 쿼리 파라미터에서 jdbcType (0) | 2016.07.08 |
자바 정규표현식 관련 클래스 (0) | 2016.07.02 |