Java에서 wait, notify, notifyAll 메소드와 모니터에 대해 알아보겠습니다.
- 스레드를 일시 중단하는 Object.wait()
- 스레드를 깨우는 Object.notify()
동작 방식
Java에서 스레드 간의 동기화를 위해서는 synchronized 블록이나 메소드를 사용하여 임계영역(critical section)을 정의해야 합니다. 이러한 임계영역에서는 단일 스레드만 접근할 수 있으며, 다른 스레드는 대기 상태가 됩니다. wait, notify, notifyAll 메소드는 이러한 대기 상태의 스레드를 관리하기 위해 사용됩니다.
wait 메소드는 스레드를 일시적으로 대기 상태로 전환합니다. wait 메소드를 호출한 스레드는 해당 객체의 모니터를 해제하고, 대기 상태로 전환합니다. 다른 스레드가 해당 객체의 모니터를 잡으면, 대기 중인 스레드는 다시 실행 가능한 상태가 됩니다.
notify 메소드는 대기 중인 스레드 중 하나를 깨웁니다. 이때, 깨워지는 스레드는 해당 객체의 모니터를 다시 잡고, 대기 상태에서 벗어나 실행 가능한 상태가 됩니다. notify 메소드를 호출한 스레드가 해당 객체의 모니터를 유지하고 있어야 합니다.
notifyAll 메소드는 대기 중인 모든 스레드를 깨웁니다. 이때, 깨워지는 스레드들은 모두 해당 객체의 모니터를 다시 잡고, 대기 상태에서 벗어나 실행 가능한 상태가 됩니다.
간단히 말해서 wait()를 호출하면 다른 스레드가 같은 객체에 대해 notify() 또는 notifyAll()을 호출할 때까지 현재 스레드가 강제로 대기합니다.
모니터에 대해 자세히 알아보자.
- Java에서 monitor란 스레드 동기화를 위한 개념 중 하나로, 모니터는 임계 영역(critical section)에 대한 접근을 제어하기 위한 객체입니다. 모니터는 단일 스레드만이 접근할 수 있는 임계 영역을 정의하고, 다른 스레드들은 해당 모니터에 대한 접근 권한을 획득하기 위해 대기 상태가 됩니다.
- Java에서 모니터는 synchronized 키워드로 구현됩니다. synchronized 키워드를 이용하여 메소드나 블록을 동기화하면, 해당 메소드나 블록에는 모니터 객체가 생성됩니다. 이 모니터 객체는 해당 메소드나 블록의 실행을 단일 스레드로 제한하는 역할을 합니다.
- 특징
- 모니터는 단일 스레드만이 실행할 수 있는 임계 영역을 제공합니다.
- 모니터는 synchronized 키워드를 사용하여 구현됩니다.
- 모니터는 스레드 동기화를 위한 기본적인 개념입니다.
- 모니터는 스레드 간의 경쟁 조건(race condition)을 해결하기 위해 사용됩니다.
- 다른 스레드들은 해당 모니터에 대한 접근 권한을 획득하기 위해서는 대기 상태가 되어야 합니다. 대기 중인 스레드들 중에서 우선순위가 높은 스레드가 모니터의 lock을 획득하고, 임계 영역에 접근하여 실행합니다. 이후, 다른 스레드들은 다시 대기 상태가 됩니다. 이를 기아 상태(starvation)라고 부르며, 이를 해결하기 위해서는 공정한 스케줄링이 필요합니다.
'TIL (Today I Learned)' 카테고리의 다른 글
OAuth 짧게 정리! (0) | 2023.06.26 |
---|---|
오늘의 리팩토링 1 - try-with-resources || Files 클래스와 Stream API (0) | 2023.03.23 |
Access-Control-Allow-Origin (0) | 2023.03.14 |
내가 사용하는 기술 (간략) 정리 01. PostgreSQL, Elasticsearch(OpenSearch) (0) | 2023.02.15 |
String배열과 ArrayList, 무엇을 써야되나? (0) | 2022.07.13 |