잠금 사용 시 주의 사항

잠금 해제 하기

  • 잠금을 획득 후 반드시 잠금을 해제해야 함.
  • 그렇지 않으면 잠금을 시도하는 스레드가 무한정 대기하기 됨.

대기 시간 지정하기

  • 잠금 획득을 시도하는 코드는 잠금 구할 때까지 계속 대기하는데, 동시 접근이 많아지면 대기 시간이 길어질 수 있음.
  • 예를 들어 임계 영역의 코드 실행에 0.5초 걸리고 동시에 1000개 스레드가 잠금을 시도하는 상황을 생각해보자.
  • 처음으로 잠금을 획득한 스레드는 0.5 초만에 코드 실행 가능하지만 마지막으로 잠금 획득한 스레드는 499.5초를 기다려야할 수도 있음.
  • 이처럼 대기 시간 길어지는 문제 막기위해서 대기 시간을 지점하는 것.
boolean acquired = lock.tryLock(5, TimeUnit.SECONDS);

교착 상태(deadlock) 피하기

  • 한 자원에서 다른 자원으로 용량 전송하는 기능 구현한다고 가정. 이 기능을 구현하려면 다음과 같이 두 자원에 대한 잠금 필요.
    • 갑 잠금 획득
    • 을 잠금 획득
    • 갑 용량 감소
    • 을 용량 증가
    • 을 잠금 해제
    • 갑 잠금 해제
  • 이 데드락도 시간 제한을 두면 피할 수 있음
  • 5초로 지정하면 5초 뒤에 잠금 획득 실패하면서 교착 상태가 풀리게된다.
  • 교착 상태를 줄이는 다른 방법은 순서대로 잠금을 획득하는 것.

라이브락

  • 2명이 지나갈 수 있는 길에서 두 사람이 마주온다.
  • 길을 피하려 둘 다 옆으로 이동했다.
  • 아직 둘 다 마주 보고있다.
  • 그래서 다시 둘 다 옆으로 이동했다.
  • 하지만 여전히 둘 다 마주 보고있다.
  • 두 사람은 이 과정 무한히 한다.
  • 이렇게 활동하는거 같지만 실제로는 아무것도 하지 않는 상태를 라이브락이라한다.
  • 철학자의 만찬 문제가 대표적인 라이브 락 문제.
  • 라이브락에 빠진 스레드나 프로세스는 뭔가 동작을 한다는 점에서 아무것도 안하고 대기하는 데드락과는 다른것.
    • 그러네 철학자들이 손에 뭐든 들고는 있으니...
  • 우선 순위 두어 해소 가능. 예를 들어 두 사람 마주했을때 우선 순위 낮은 사람이 옆으로가도록. 중재자 둘수도있다. 누가 옆으로 갈지 중재자가 정하는 것. 임의성 주는 법도 있다. 옆으로 이동시 임의 시간만큼 대기했다 이동하게 구현하는 것.

기아 상태

  • 작업의 우선 순위가 낮아 실행이 안되는 것