시냅스

Java 프로세스 동기화 process synchronization 정리 본문

Java, Spring

Java 프로세스 동기화 process synchronization 정리

ted k 2023. 2. 11. 13:55

https://www.baeldung.com/java-wait-notify

 

Synchronized keyword

  • static과 heap을 공유하면서 동시접근이 가능한 resource 에 관하여 race condition 을 회피하기 위해 Java에서 제공하는 키워드
  • 함수에 synchronized 키워드를 붙이거나 (Lock in Synchronized Methods)
    • 함수에 synchronized를 걸면 함수가 포함된 해당 객체(this)에 lock을 거는 것과 동일하다.
  • synchronized block을 만들어 사용할 수 있다. (Synchronized Statements)
    • 필요한 부분만 lock이 걸린다.
    • 객체에 lock을 거는 것은 동일하다.
  • 만약 singleton 객체에 synchronized 키워드를 사용할 경우 synchronized 메소드가 많을 수록 deadlock 발생 확률이 높다
    • 이를 위해 LazyHolder 방식을 사용한다.
  • 내부적으로는 monitor를 이용한다.

 

Reentrant

  • Synchronized 에서 this(객체)를 통해 Locking 하던 것을 임의의 객체를 사용하여 유연성을 주는 Class
  • synchronized 의 경우 thread 의 정보를 알 수 없다
    • thread가 멈췄는지
    • thread가 기아상태에 빠졌는지
    • 내 thread에서 해당 locking 을 들고 있는지 등
  • 따라서 synchronized 구문을 만나면 해당 객체의 locking을 realese 하기까지 무한히 기다려야 된다.
  • Reentrant 는 위의 상황을 피하기 위해 여러 메소드를 제공한다
    • lock() : lock을 얻음
    • unlock() : lock 해제
    • tryLock() : 지금 즉시 상태를 확인하고 true, false를 return → true면 lock 얻음
    • isHeldByCurrentThread() : 현재 thread가 lock을 갖고 있는지
    • hasQueuedThread() : 해당 객체의 lock을 얻기위해 기다리는 thread가 있는지
    • getOwner() : 지금 lock을 갖고 있는 thread return
  • 개발자가 직접 원할 때 lock 과 unlock 을 명시해서 대기시간을 줄일 수 있다.

 

ReentrantReadWriteLock

  • Reentrant에 Read/Write Lock 을 추가한 Class
  • Read Lock : 동시에 여러 Thread 접근 가능
  • Write Lock : 오직 하나의 Thread 에서만 접근 가능
  • Read가 Write 보다 더 많이 수행될 것이고,
  • DB의 경우 대부분은 Read 이고, Read는 Shared Lock 이 주어지고 공유 접근이 가능하다, 따라서 Thread 에서도 동시에 접근하여 처리하는 것이 효율 적일 것이다.
  • 다만 Write 의 경우 자원이 변경되기 때문에 접근을 해제할 수 있어야 한다.
  • 이러한 요구조건을 맞춘 클래스이다.

 

StampedLock

  • 위의 ReentrantReadWriteLock은 구분되어있지만 여전히 Read Lock이 걸려있다면, 해제될 때 까지 Write Lock이 기다려야 한다.
  • 이를 위해 StampedLock은 낙관적 읽기 lock (optimistic reading lock)을 제공한다.
  • 낙관적 읽기 lock은 낙관적 읽기 도중에 Wrtie Lock에 의해 바로 풀린다.
  • 따라서, 낙관적 읽기 에 실패하면 Read lock을 다시 얻어와야 한다.
  • 정리하면, 무조건 read 를 위한 lock을 거는 것이 아니라, read 와 write가 충돌하는 경우에 write가 끝나고 read lock을 거는 것이다.

 

Condition

  • condition 은 wait notify의 확장판이다.
  • 조건을 추가하여 쓰레드를 구분하여 통지하기 위해 사용한다.
  • 각각 쓰레드를 waiting pool 에서 따로 기다리게 하거나 호출할 수 있다.

 

다만, thread pool 에 들어있는 thread 들을 위의 방법만으로 관리하기에는 쉽지 않다.

따라서 Semaphore를 사용한다.

 

 

https://liltdevs.tistory.com/84

 

뮤텍스 락, 세마포어, 모니터, 라이브니스, Mutex Locks, Semaphores, monitors, Liveness

뮤텍스 락 Mutex Locks 고급 언어에서 개발한 도구 동기화를 위한 가장 간단한 도구 2개만 가능하다. acquire()을 통해 ciritical section에 진입 허가를 받는다. (원자적 연산) release()를 통해 허가를 반납한

liltdevs.tistory.com

 

Comments