레이블이 java FileLock인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java FileLock인 게시물을 표시합니다. 모든 게시물 표시

2016년 7월 8일 금요일

JDK 1.4 튜토리얼 - 1장(2/2)

CHAPTER 1 . 기본 NIO(New Input/Output) (2/2)

파일 잠금 기능

서로 다른 프로세스나 쓰레드에 의한 파일 접근을 막기 위해 전체 혹은 특정 부분을 잠금 것
lock 종류
  • lock 설명
    • mandatory lock - 필수 잠금
    • advisory lock - 권고 잠금
      • 다른 스레드가 객체의 필드를 수정하지 것을 막지 못하며, 단지 락을
        획득하지 못하게 함
  • 파일 잠금 기능
    • 배타적 잠금 : synchronized 키워드와 비슷, 다른 스레드가 유사한 락을 얻지 못하게 함
      • 쓰기 작업 시
    • 공유 잠금 : 잠금을 얻을 수 있으나 배타적 잠금은 얻지 못함
      • 읽기 작업 시
lock 이용
  • 파일 전체 잠금
  • 파일 부분 잠금
  • OverlappingFileLockException 발생하는 경우
    • 동일한 JVM 에서 배타적 잠금 덮어쓰는 경우
    • 배타적인 잠금과 공유 잠금이 겹치게 생성하려는 경우
  • 특정 OS에서는 공유 잠금을 지원 하지 않음
    • java.nio.channels.FileLock.isShared() : 잠금 유형 확인
      • true : 공유 잠금
      • false : 배타적 잠금
lock 획득
  • FileChannel 객체에 생성
  • 두 가지 획득 방법
    • FileChannel.lock()
      • lock이 획득될 때 까지 블록킹
    • FileChannel.tryLock()
      • lock이 곧바로 획득되지 않는 경우에 null을 리턴
  • lock 파라미터 설명
    • FileChannel.lock(long position, long size, boolean shared) :
      • position - 시작 위치 (바이트 단위)
      • size - 길이 (바이트 단위)
      • shared - true : 공유 , false : 배타적
FileOutputStream fo = new FileOutputStream("test.txt");
FileChannel fc = fo.getChannel();
FileLock fl = fc.lock();  //방법1 - 전체 잠금
FileLock fl = fc.lock(0L,Long.MAX_VALUE ,false); //전체 잠금 요청
  • 해지 방법 ( 두 가지)
    • java.nio.channels.FileLock.relase() 사용
    • FileChannel 을 종료
휴대성 (호환성)에 고려
  • 파일 락은 OS에 구현에 따라 종속 적인
  • 다양한 OS을 만족 시키는 방법
    • 배타적 잠금을 사용
    • 모든 잠금을 advisory(권고)로 취급
    • 잠금은 동일한 프로세스 내의 쓰레드들에 의해 영향을 받는다.


출처 : 인포북 JDK 1.4 Tutorial