남궁성 님의 "Java의 정석" 책을 정리한 포스팅 입니다.
9. 동기화
- 한 스레드가 진행중인 작업을 다른 스레드가 간섭하지 못하게 막는 것입니다.
- 멀티스레드의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하므로 서로의 작업에 영향을 주게 됩니다.
- 한 스레드가 특정 작업을 끝마치기 전까지 다른 스레드에 의해 방해받지 않도록 하는것이 필요합니다.
임계영역
- 공유데이터를 사용하는 코드 영역입니다.
락
- 단 하나의 스레드만 공유데이터를 사용하도록 하는 매커니즘입니다.
- 해당 공유데이터를 사용하는 스레드는 락을 획득합니다.
- 임계영역의 모든 코드를 수행하고 나서 락을 반납하며, 다른 스레드가 반납된 락을 획득하여 임계영역에 접근할 수 있습니다.
synchronized
- synchronized 키워드를 붙여 임계영역을 설정합니다.
- lock의 획득과 반납이 자동적으로 수행됩니다.
- 해당 객체의 lock을 가지고 있는 스레드만 임계영역의 코드를 수행할 수 있습니다.
wait(), notify()
- 한 스레드가 락을 오랫동안 보유하지 않도록 고안된 방법입니다.
- 동기화 블록에서만 사용할 수 있습니다.
wait()
- 임계영역의 코드를 수행하다가 더이상 진행할 상황이 아닐경우 호출합니다.
- 스레드가 락을 반납하고 기다리게 합니다.
notify()
- 작업을 진행할 수 있는 상황이 되면 호출합니다.
- 스레드가 다시 작업을 수행할 수 있도록 합니다.
- 대기중인 스레드만 해당됩니다.
Lock, Condition
volatile
fork & join
'Java' 카테고리의 다른 글
[Java][Tutorial] 1-2. Learning the Java Language: Language Basics (0) | 2024.01.14 |
---|---|
[Java의 정석] 13-3. 스레드: 실행 제어 (1) | 2023.11.30 |
[Java의 정석] 15-6. 입출력: Serialization (0) | 2023.11.29 |
[Java의 정석] 15-5. 입출력: File (1) | 2023.11.29 |
[Java의 정석] 15-4. 입출력: 표준 입출력 (0) | 2023.11.29 |