JAVA

[Java] Lock - ReentrantLock

lakelight 2022. 12. 8. 17:52
728x90
반응형

 

Lock

멀티스레드, 동시성 프로그래밍에서 가장 중요한 개념은 Thread와 Lock입니다.

  • 하나의 자원에 대해 여러 Thread가 동시에 접근하는 것을 도와주는 도구입니다.
  • Synchronized, 동기화하거나, 아니면 접근 자체를 직렬화한다고 표현합니다.
  • 멀티스레드 환경에서 여러 Thread가 Heap 메모리에 있는 객체나 자원을 접근할 때 동기화를 통해 접근을 통제해야 합니다.
  • Lock을 통해서 공유 자원을 한 Thread만 접근할 수 있도록 통제할 수 있습니다.

 

Lock 기능

  • 특정 조건에 다라 지정한 수의 Thread만 자원에 접근하게 할 수 있습니다.
  • 접근을 못한 Thread들은 줄을 세워, 대기하게 하고 들어갈 수 있을 때 다시 동작하게 할 수 있습니다.
    → 대기 상태의 Thread는 Sleep 상태라고 하며, 다시 동작하게 하는 것은 notify() 를 통해서 합니다.

 

Lock 종류

암묵적 Lock : synchronized

  • 블럭이나 메서드 단위로 synchronized로 감싸서 Lock을 겁니다.
  • 어느 부분이 Lock 상태인지 명확하지 않아서 암묵적인 Lock이라고 합니다.
  • Thread 간의 Lock을 획득하는 순서를 보장해주지 않습니다. (unFair)
  • 1개의 Thread만 공유 자원에 접근할 수 있습니다.

명시적 Lock : ReentrantLock

  • 다중 스레드가 공유하는 주요 컬렉션 대신 완전히 독립적인 Lock을 채택하여 구현하는 Lock 입니다.
  • Thread 간의 Lock을 획득하는 순서를 보장할 수도 있고, 보장하지 않을 수도 있습니다. (Fair, unFair)
  • Lock을 획득하려는 스레드의 개수가 4개 이상일 때 사용하면 좋습니다.
  • 여러개의 Thread가 공유 자원에 접근할 수 있습니다.

 

ReentrantLock Code

private ResponseWrapper Function(Command command){

    this.lock.lock();

    //Logic();
    
    try {
        //Logic();
    } catch (Exception e) {
        //Logic();
    } finally {
        this.lock.unlock();
    }
}
위에 코드와 같이 필요한 부분에 Lock을 걸어주어 공유자원에 대해 스레드 접근을 통제할 수 있습니다.

 

[참고]

1. Lock & ReentrantLock

728x90
반응형